Rom Full
Rom Full
0013 0018 0018 001B 001C 001F 0020 0020 0023 0025 0028 0028 002B 0030 0030 0031 0034 0035 0038 0038 0038 0038 0039 003A 003D 003E 0041 0042 0043 0045 0048 0049 004A 004D 004E 004F 0050 0051 0052 0053 0053 0054 0055 0058 005C
***OPERACNI SYSTEM ZX SPECTRUM*** *============================================================ F3 RESET di studeny start systemu AF xor A nulovani _A 11 FF FF ld DE,#FFFF nejvyssi adresovatelny bajt C3 CB 11 jp RESET1 * *RESTARTY-vektory * 2A 5D 5C ERROUT ld HL,(CHADD) ukazatel na chybu se nastavi 22 5F 5C ld (XPTR),HL na misto,ktere interpreter 18 43 jr ERROR neumi zpracovat * C3 F2 15 PRTOUT jp GIV2 vypis znaku z _A * FF FF FF FF DEFB #FF #FF #FF #FF #FF * 2A 5D 5C GETACT ld HL,(CHADD) prisune aktualni znak z pgmu 7E ld A,(HL) nebo pri zadani CD 7D 00 BLOWUP call #007D testuje zda jde o ridici znak D0 ret NC tisknutelny znak/token:navrat * CD 74 00 GETNXT call #0074 prisune nasledujici znak 18 F7 jr BLOWUP FF FF FF DEFB #FF #FF #FF * C3 5B 33 CALSW jp CALC prepnuti na kalkulator FF FF FF FF DEFB #FF #FF #FF #FF #FF * C5 REST30 push BC rezervuje misto v pracovnim 2A 61 5C ld HL,(WORKSP) prostoru,pocet bajtu v _BC E5 push HL C3 9E 16 jp RESERV * *rutina preruseni (obsluha hodin a klavesnice) * F5 INTERR push AF uschova registru E5 push HL 2A 78 5C ld HL,(FRAMES) kazdou 50tinu sekundy 23 inc HL inkrementuje >FRAMES< 22 78 5C ld (FRAMES),HL 7C ld A,H testuje 2 bajty >FRAMES< B5 or L na nulu 20 03 jr NZ,#0048 FD 34 40 inc (IY+#40) kdyz jsou oba nulove,inkrementuje 3. C5 push BC D5 push DE CD BF 02 call KEYBOA dotaz na stav klavesnice D1 pop DE obnoveni registru C1 pop BC E1 pop HL F1 pop AF FB ei povoli preruseni C9 ret * E1 ERROR pop HL adresa mista chyby 6E ld L,(HL) na ni ulozeny kod chyby FD 75 00 ld (ERRNR),L zapise do >ERRNR< ED 7B 3D 5C ld SP,(ERRSP) obnoveni stackpointru C3 C5 16 jp CLRCAL
005F 005F 0066 0066 0066 0066 0067 0068 006B 006C 006D 006F 0070 0071 0072 0074 0074 0077 0078 007B 007C 007D 007D 007D 007D 007F 0080 0082 0083 0083 0085 0086 0086 0088 0089 008A 008A 008B 008D 008F 0090 0091 0094 0095 0095 0095 0095 0095 0095 0095 0096 0099 009F 00A1 00A3 00A8 00AF 00B3 00B5 00B8
* FF FF FF FF DEFB #FF #FF #FF #FF #FF #FF #FF * *nemaskovatelne preruseni * NMI push AF push HL ld HL,(NMIREG) pokud >NMIREG< nulove,probehne ld A,H studeny start od #0000 or L jr NZ,#0070 (ma byt 2801,tzn. jr Z,#0070) jp (HL) pop HL ve vsech ostatnich pripadech pop AF n e p r o b e h n e retn * ld HL,(CHADD) ukazatel do pgmu inc HL posunut o 1 misto ld (CHADD),HL ld A,(HL) prevzeti noveho znaku ret * *porovnani znaku * cp #21 pokud >=#21,tedy tisknutelny znak ret NC pak navrat cp #0D taktez pri 'ENTER' ret Z * cp #10 pri #00..#0F ret C navrat s nastavenym CARRY * cp #18 ccf pri #18..#20 ret C navrat s nastavenym CARRY * inc HL zde pri #10..#17 inkrementace cp #16 vykryti #16..#17 jr C,#0090 inc HL pri nich preskoci jeste 1 bajt scf ld (CHADD),HL ukazuje na aktualni znak ret navrat s nastavenym CARRY * *============================================================= *zde jsou ulozeny obsahle tabulky *zacinaji znakovym rozepsanim vsech prikazu BASICu *ke kodu posledniho pismena je pricteno #80 (bit7=1) * DEFB #BF mezera DEFB 'RN' #C4 RND DEFB 'INKEY' #A4 INKEY$ DEFB 'P' #C9 PI DEFB 'F' #CE FN DEFB 'POIN' #D4 POINT DEFB 'SCREEN' #A4 SCREEN$ DEFB 'ATT' #D2 ATTR DEFB 'A' #D4 AT DEFB 'TA' #C2 TAB DEFB 'VAL' #A4 VAL$
F5 E5 2A B0 5C 7C B5 20 01 E9 E1 F1 ED 45 2A 5D 5C 23 22 5D 5C 7E C9
FE 21 D0 FE 0D C8 FE 10 D8 FE 18 3F D8 23 FE 16 38 01 23 37 22 5D 5C C9
BF 52 49 50 46 50 53 41 41 54 56
4E 4E C9 CE 4F 43 54 D4 41 41
C4 4B 45 49 4E 52 45 54 D2 C2 4C A4
00BC 00C0 00C3 00C6 00C9 00CC 00CF 00D2 00D5 00D8 00DA 00DD 00E0 00E3 00E6 00E9 00ED 00EF 00F2 00F6 00FA 00FD 0100 0102 0105 0107 0109 010B 010F 0113 0115 0119 011F 0122 0128 012C 0131 0137 013E 0143 0149 014D 0153 0156 015B 0160 0166 016D 0171 0174 017A 017F 0183 0187 018B 0192 0195 019B 01A3 01A6
43 56 4C 53 43 54 41 41 41 4C 45 49 53 53 41 50 49 55 53 43 4E 42 4F 41 3C 3E 3C 4C 54 54 53 44 43 46 4D 45 4F 43 4D 56 42 43 49 50 46 42 49 4F 4F 4C 4C 53 52 44 52 4E 42 43 44 52
4F 41 45 49 4F 41 53 43 54 CE 58 4E 51 47 42 45 CE 53 54 48 4F 49 D2 4E BD BD BE 49 48 CF 54 45 41 4F 4F 52 50 4C 45 45 45 49 4E 41 4C 52 4E 56 55 50 4C 54 45 41 45 45 4F 4F 49 45
44 C5 CC CE CE D3 CE CE D3 CE D0 D4 D2 CE D3 45 CB D2 52 A4 52 A4 D4 CE C4
4E C5 45 CE 45 46 D4 52 56 41 45 4F 52 52 45 52 CB 50 41 49 56 45 D4 52 49 4F 41 54 53 D7 52 4E CD CD D0 20 4D C5 53 4E 53 47 49 D0 43 45 53 47 45 D2 49 53 D0 C4 C1 54 44 54
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB
'COD' #C5 CODE 'VA' #CC VAL 'LE' #CE LEN 'SI' #CE SIN 'CO' #D3 COS 'TA' #CE TAN 'AS' #CE ASN 'AC' #D3 ACS 'AT' #CE ATN 'L' #CE LN 'EX' #D0 EXP 'IN' #D4 INT 'SQ' #D2 SQR 'SG' #CE SGN 'AB' #D3 ABS 'PEE' #CB PEEK 'I' #CE IN 'US' #D2 USR 'STR' #A4 STR$ 'CHR' #A4 CHR$ 'NO' #D4 NOT 'BI' #CE BIN 'O' #D2 OR 'AN' #C4 AND '<' #BD <= '>' #BD >= '<' #BE <> 'LIN' #C5 LINE 'THE' #CE THEN 'T' #CF TO 'STE' #D0 STEP 'DEF F' #CE DEF FN 'CA' #D4 CAT 'FORMA' #D4 FORMAT 'MOV' #C5 MOVE 'ERAS' #C5 ERASE 'OPEN ' #A3 OPEN # 'CLOSE ' #A3 CLOSE # 'MERG' #C5 MERGE 'VERIF' #D9 VERIFY 'BEE' #D0 BEEP 'CIRCL' #C5 CIRCLE 'IN' #CB INK 'PAPE' #D2 PAPER 'FLAS' #C8 FLASH 'BRIGH' #D4 BRIGHT 'INVERS' #C5 INVERSE 'OVE' #D2 OVER 'OU' #D4 OUT 'LPRIN' #D4 LPRINT 'LLIS' #D4 LLIST 'STO' #D0 STOP 'REA' #C4 READ 'DAT' #C1 DATA 'RESTOR' #C5 RESTORE 'NE' #D7 NEW 'BORDE' #D2 BORDER 'CONTINU' #C5 CONTINUE 'DI' #CD DIM 'RE' #CD REM
01A9 01AC 01B1 01B7 01BC 01C0 01C4 01C7 01CC 01D0 01D4 01D9 01DD 01E0 01E4 01ED 01EF 01F2 01F6 01FB 0201 0205 0205 0205 0205 0205 0205 0205 0206 0207 0208 0209 020A 020B 020C 020D 020D 020E 020F 0210 0211 0212 0213 0214 0215 0215 0216 0217 0218 0219 021A 021B 021C 021D 021D 021E 021F 0220 0221 0222
46 47 47 49 4C 4C 4C 50 4E 50 50 50 52 53 52 49 43 44 43 52 43
4F 4F 4F 4E 4F 49 45 41 45 4F 52 4C 55 41 41 C6 4C 52 4C 45 4F
D2 20 20 50 41 53 D4 55 58 4B 49 4F CE 56 4E D3 41 45 54 50
54 53 55 C4 D4 53 D4 C5 4E D4 C5 44 D7 41 55 D9
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB
'FO' #D2 FOR 'GO T' #CF GO TO 'GO SU' #C2 GO SUB 'INPU' #D4 INPUT 'LOA' #C4 LOAD 'LIS' #D4 LIST 'LE' #D4 LET 'PAUS' #C5 PAUSE 'NEX' #D4 NEXT 'POK' #C5 POKE 'PRIN' #D4 PRINT 'PLO' #D4 PLOT 'RU' #CE RUN 'SAV' #C5 SAVE 'RANDOMIZ' #C5 RANDOMIZE 'I' #C6 IF 'CL' #D3 CLS 'DRA' #D7 DRAW 'CLEA' #D2 CLEAR 'RETUR' #CE RETURN 'COP' #D9 COPY
42 48 59 36 35 54 47 56 4E 4A 55 37 34 52 46 43 4D 4B 49 38 33 45 44 58 0E 4C 4F 39 32 57
* *============================================================ *tabulka usporadani matice klaves v ASCII *tato tabulka prevadi spojeni kontaktu klavesnice *na odpovidajici hodnotu ASCII * KEYTAB DEFB #42 B rada 1 DEFB #48 H DEFB #59 Y DEFB #36 6 DEFB #35 5 DEFB #54 T DEFB #47 G DEFB #56 V * DEFB #4E N rada 2 DEFB #4A J DEFB #55 U DEFB #37 7 DEFB #34 4 DEFB #52 R DEFB #46 F DEFB #43 C * DEFB #4D M rada 3 DEFB #4B K DEFB #49 I DEFB #38 8 DEFB #33 3 DEFB #45 E DEFB #44 D DEFB #58 X * DEFB #0E symbol rada 4 DEFB #4C L DEFB #4F O DEFB #39 9 DEFB #32 2 DEFB #57 W
0223 0224 0225 0225 0226 0227 0228 0229 022A 022B 022C 022C 022C 022C 022C 022C 022C 022C 022C 022D 022E 022F 0230 0231 0232 0233 0234 0235 0236 0237 0238 0239 023A 023B 023C 023D 023E 023F 0240 0241 0242 0243 0244 0245 0246 0246 0246 0246 0247 0248 0249 024A 024B 024C 024D 024E 024F 0250 0251 0252
53 5A * 20 0D 50 30 31 51 41
DEFB #53 DEFB #5A DEFB DEFB DEFB DEFB DEFB DEFB DEFB #20 #0D #50 #30 #31 #51 #41
E3 C4 E0 E4 B4 BC BD BB AF B0 B1 C0 A7 A6 BE AD B2 BA E5 A5 C2 E1 B3 B9 C1 B8
7E DC DA 5C B7 7B 7D D8 BF AE AA AB DD
* *tabulka tokens * *(pro zjisteni tokenu z ASCII pri rozsirenem modu *nebo stisknute klavese "symbol") * *zelene prikazy nad klavesami A..Z * DEFB #E3 READ DEFB #C4 BIN DEFB #E0 LPRINT DEFB #E4 DATA DEFB #B4 TAN DEFB #BC SGN DEFB #BD ABS DEFB #BB SQR DEFB #AF CODE DEFB #B0 VAL DEFB #B1 LEN DEFB #C0 USR DEFB #A7 PI DEFB #A6 INKEY$ DEFB #BE PEEK DEFB #AD TAB DEFB #B2 SIN DEFB #BA INT DEFB #E5 RESTORE DEFB #A5 RND DEFB #C2 CHR$ DEFB #E1 LLIST DEFB #B3 COS DEFB #B9 EXP DEFB #C1 STR$ DEFB #B8 LN * *cervene prikazy pod klavesami A..Z * DEFB #7E vlnovka DEFB #DC BRIGHT DEFB #DA PAPER DEFB #5C otocene lomitko DEFB #B7 ATN DEFB #7B lomena zavorka otviraci DEFB #7D lomena zavorka uzaviraci DEFB #D8 CIRCLE DEFB #BF IN DEFB #AE VAL$ DEFB #AA SCREEN$ DEFB #AB ATTR DEFB #DD INVERSE
0253 0254 0255 0256 0257 0258 0259 025A 025B 025C 025D 025E 025F 0260 0260 0260 0260 0261 0262 0263 0264 0265 0266 0267 0268 0269 026A 026A 026A 026A 026B 026C 026D 026E 026F 0270 0271 0272 0273 0274 0275 0276 0277 0278 0279 027A 027B 027C 027D 027E 027F 0280 0281 0282 0283 0284 0284 0284 0284 0285
DE DF 7F B5 D6 7C D5 5D DB B6 D9 5B D7
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB
#DE #DF #7F #B5 #D6 #7C #D5 #5D #DB #B6 #D9 #5B #D7
OVER OUT copyright ASN VERIFY kolmicka MERGE hranata zavorka uzaviraci FLASH ACS INK hranata zavorka otviraci BEEP
0C 07 06 04 05 08 0A 0B 09 0F
E2 2A 3F CD C8 CC CB 5E AC 2D 2B 3D 2E 2C 3B 22 C7 3C C3 3E C5 2F C9 60 C6 3A
D0 CE
* *povely nad klavesami 0..9 * DEFB #0C DELETE DEFB #07 EDIT DEFB #06 CAPS lock DEFB #04 TRUE VIDEO DEFB #05 INV. VIDEO DEFB #08 kurzor vlevo DEFB #0A kurzor dolu DEFB #0B kurzor nahoru DEFB #09 kurzor vpravo DEFB #0F GRAPHICS * *cervene prikazy na klavesach A..Z * DEFB #E2 STOP DEFB #2A * DEFB #3F ? DEFB #CD STEP DEFB #C8 >= DEFB #CC TO DEFB #CB THEN DEFB #5E sipka vzhuru (mocnina) DEFB #AC AT DEFB #2D DEFB #2B + DEFB #3D = DEFB #2E . (tecka) DEFB #2C , (carka) DEFB #3B ; (strednik) DEFB #22 " (uvozovky) DEFB #C7 <= DEFB #3C < DEFB #C3 NOT DEFB #3E > DEFB #C5 OR DEFB #2F / DEFB #C9 <> DEFB #60 libra DEFB #C6 AND DEFB #3A : (dvojtecka) * *cervene prikazy pod klavesami 0..9 * DEFB #D0 FORMAT DEFB #CE DEF FN
0286 0287 0288 0289 028A 028B 028C 028D 028E 028E 028E 028E 028E 028E 028E 028E 0290 0290 0293 0296 0296 0298 0299 029B 029D 029E 029F 02A0 02A1 02A3 02A5 02A7 02A8 02A9 02AB 02AC 02AE 02B0 02B0 02B0 02B0 02B1 02B2 02B3 02B5 02B6 02B8 02B9 02BA 02BB 02BC 02BE 02BF 02BF 02BF 02BF 02BF 02BF 02C2 02C3
A8 CA D3 D4 D1 D2 A9 CF
2E 2F 11 FF FF 01 FE FE ED 2F E6 28 67 7D 14 C0 D6 CB 30 53 5F 20 2D CB 38 78 1F 0E
08 3C FA F4 00 E6
7A 3C C8 FE 28 C8 FE 19 C8 7B 5A 57 FE 18 C9
CD 8E 02 C0
* *============================================================ * *OBSLUHA KLAVESNICE *vklada do _E hodnotu stisknute klavesy #00..#27 *zaroven znaci do _D shiftovou funkci * ld L,#2F ukazovatko na konec tabulky klicovych kodu +8 ld DE,#FFFF zadne tlacitko ld BC,#FEFE _C I/O port klavesnice _B maska pro test s jednou nulou NXTROW in A,(C) zkontroluje jednu petici klaves cpl jednickovy bit oznacuje stisk and #1F s klavesnici souvisi jen bit0..bit5 jr Z,NOKEY zadny stisk ld H,A hodnota z matice do _H ld A,L pocatecni hodnota TEST3 inc D _D je #FF pri 1 az 2 stisk.klavesach ret NZ navrat pri vice nez 2 stisk.klavesach KEYNO sub 8 _A ukazuje do tabulky klicovych kodu srl H hledani stisku klavesy jr NC,KEYNO smycka do nastaveni CARRY ld D,E pro 2 pripustne klavesy znovu #FF ld E,A kod klavesy (#00..#27) do _E jr NZ,TEST3 kontrola dalsi klavesy v rade NOKEY dec L nasledujici petice klaves rlc B 0 v masce posunuta o misto doleva jr C,NXTROW dalsi rada klaves * *kdyz se 0 z _B objevi v CARRY, je rutina ukoncena * ld A,D test funkcnich klaves inc A pri jedne klavese je zde #FF ret Z navrat pri jedine stlacene klavese cp #28 klavesa 'CAPS shift' ? ret Z ano cp #19 klavesa 'SYMBOL shift' ? ret Z ano ld A,E zamena registru _E a _D ld E,D ld D,A k prezkouseni cp #18 kombinace 'SYMBOL' & dalsi klavesa ret nastavi ZERO * *============================================================ *dotaz na klavesnici a vyhodnoceni zadosti INTERRUPT *kazdou 50tinu sekundy * KEYBOA call #028E dotaz na klavesnici ret NZ *zde nastane sirsi vyhodnoceni v pripadech:
02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C3 02C6 02C8 02CA 02CB 02CC 02CD 02CF 02D1 02D2 02D5 02D6 02D8 02D8 02DB 02DC 02DF 02E0 02E2 02E3 02E6 02E7 02E9 02EB 02ED 02EE 02F0 02F1 02F1 02F1 02F1 02F2 02F3 02F4 02F6 02F7 02FA 02FB 02FC 02FF 0302 0303 0306 0307 0308 030B 030F 0310
21 CB 20 23 35 2B 20 36 7D 21 BD 20 CD D0 21 BE 28 EB 21 BE 28 CB 20 EB CB C8
00 5C 7E 07
02 FF 04 5C EE 1E 03 00 5C 2E 04 5C 27 7E 04 7E
5F 77 23 36 23 3A 77 23 FD FD E5 CD E1 77 32 FD C9
05 09 5C 4E 07 56 01 33 03 08 5C CB 01
*-zadna nebo jedina klavesa *-'CAPS' & jina klavesa *-'SYMBOL' & jina klavesa * *vyhodnoceni klavesnice pouziva 2*4 bajty >KSTATE< *aby mohlo zpracovat 2 nasledne stisknute klavesy * *byte0:co stlaceno (#FF=nic) *byte1:pocitadlo autorepeatu *byte2:pocitadlo pro spusteni autorepeatu *byte3:kod stisknute klavesy (ASCII nebo token) * ld HL,KSTATE bit 7,(HL) je tato ctverice volna ? jr NZ,BLOCK2 skok pri "nepouzito" inc HL dec (HL) odpocitani autorepeatu dec HL navrat na byte0 jr NZ,BLOCK2 ld (HL),#FF blok uvolnen BLOCK2 ld A,L ld HL,KSTATE+4 prednostne pouzit druhy blok cp L byli jsme u druheho bloku ? jr NZ,#02C6 kdyz ne:znovu tento test * call #031E ret NC konec pri nestisknute klavese ld HL,KSTATE cp (HL) stisknuta jeste taz klavesa ? jr Z,KEYREP pokud ano,repeat ex DE,HL ld HL,KSTATE+4 zkouska druheho bloku cp (HL) stisknuta jeste taz klavesa ? jr Z,KEYREP pokud ano,repeat bit 7,(HL) druhy blok volny ? jr NZ,#02F1 ex DE,HL >KSTATE< zpet do _HL bit 7,(HL) je volno ? ret Z konec pri "obsazeno" * *stlacena nova klavesa * ld E,A ld (HL),A obsah byte0 inc HL posun na byte1 ld (HL),#05 nastaveni pocitadla repeatu na 5 inc HL posun na byte2 ld A,(REPDEL) prevezme nastavenou hodnotu prodlevy ld (HL),A a ulozi do byte2 inc HL posun na byte3 ld C,(MODE) ld D,(FLAGS) push HL call #0333 vyda kod klavesy/token pop HL ld (HL),A a ulozi jej do byte3 ld (LASTK),A i do >LASTK< EE set 5,(FLAGS) bit5 >FLAGS< znaci novy stisk klavesy ret *
0310 0310 0310 0311 0313 0314 0315 0316 0316 0319 031A 031B 031C 031E 031E 031F 0321 0322 0324 0325 0325 0327 0329 032B 032C 032F 0330 0331 0332 0333 0333 0333 0333 0333 0334 0336 0338 0339 033C 033E 0340 0341 0341 0341 0341 0344 0345 0347 0347 0347 0347 034A 034A 034A 034A 034C 034D 034E 034F 034F
23 36 05 23 35 C0 3A 0A 5C 77 23 7E 18 EA 42 16 00 7B FE 27 D0 FE 20 CB C0 21 19 7E 37 C9 18 03 78 05 02
7B FE 38 0D FA 28 C6 C9
3A 2F 4F 03 03 4F
21 EB 01 04 28 03
21 05 02
16 00 19 7E C9
*repeat * KEYREP inc HL do pocitadla repeatu ld (HL),5 vlozena hodnota 5 inc HL cas prodlevy dec (HL) dekrementovan ret NZ * ld A,(REPPER) ulozeni intervalu ld (HL),A do BYTE2 inc HL posun na byte3 (samotna klavesa) ld A,(HL) hodnota klavesy jr #0308 * ld B,D sledovani funkcnich klaves ld D,#00 ld A,E cp #27 'CAPS' ret NC nebo zadna klavesa: navrat * cp #18 'SYMBOL' ? jr NZ,#032C ano:dalsi vyhodnoceni bit 7,B ret NZ navrat jen pri samostatnem 'SYMBOL' ld HL,KEYTAB adresa tabulky klicovych slov add HL,DE aktualni znak jako hodota ASCII ld A,(HL) z tabulky do _A scf CARRY signalizuje ret "znak nalezen" *============================================================ *vyhodnoceni zjistenych kodu klaves a zobrazeni *BASIC-token podle modu kurzoru (=K=,=L=,=C=,=E=) * ld A,E ASCII stlacene klavesy cp #3A pri cislu,SPACE,ENTER jr C,#0367 nebo obou shiftech:skok dec C pouze pismena A..Z jp M,#034F jr Z,#0341 add #4F UDG pismena od kodu #90 ret * *zelene tokens nad klavesami A..Z * ld HL,#01EB inc B jr Z,TABDIR * *cervene tokens pod klavesami A..Z * ld HL,KEYTAB * *token bude prevzat z prislusne tabulky * TABDIR ld D,#00 _E obsahuje ASCII hodnotu znaku add HL,DE v_HL bazova adresa minus #41 neb #30 ld A,(HL) prevzeti prislusneho kodu ret * *cervene tokens na klavesach A..Z
034F 034F 0352 0354 0356 0358 035A 035E 035F 0360 0361 0363 0364 0364 0366 0367 0367 0369 036A 036B 036E 0370 0370 0370 0370 0373 0375 0377 0379 037B 037D 037E 037F 0381 0382 0382 0384 0385 0386 0388 0389 0389 0389 0389 038C 038E 0390 0392 0394 0396 0398 0399 039A 039C 039D 039E 039F 03A1 03A1 03A1
* 21 CB 28 CB 28 FD C0 04 C0 C6 C9 29 02 40 F4 5A 0A CB 30 5E ld bit jr bit jr bit ret inc ret add ret * C6 A5 C9 * FE 30 D8 0D FA 9D 03 20 19 cp ret dec jp jr '0' C C M,#039D NZ,#0389 znak < #30 ? zjisteni modu pri =K=,=L=,=C= pri =G= add #A5 ret primy vypocet tokenu HL,#0229 0,B Z,TABDIR 3,D Z,#0364 3,(FLAGS2) NZ B NZ #20 'SYMBOL' & pismeno mod =K= ? ano test na 'CAPS lock' ne shift ? ne zmena na male pismeno
20
21 CB 28 FE 30 D6 04 C8 C6 C9
54 02 68 D3 38 07 20 08
D6 36 04 C8 C6 FE C9
21 FE 28 FE 28 E6 C6 04 C8 EE C9 04 C8 CB
30 02 39 BA 30 B6 07 80 0F
68
* *cervene tokens pod 0..9 * ld HL,#0254 bit 5,B jr Z,TABDIR bez 'CAPS' cp '8' jr NC,#0382 sub #20 ze #30..#37 udela #10..#17 inc B ret Z pokud bez shiftu add 8 pricte 8:kod barvy #18..#1F ret *klavesy '8' a '9' (kody pro BRIGHT a FLASH) sub #36 vysledek 2..3 bez shiftu inc B ret Z bez shiftu add #FE vysledek 0..1 se shiftem ret * *grafika na klavesach 0..9 * ld HL,#0230 (s 'CAPS') cp '9' test na 'GRAPHIC' jr Z,TABDIR cp '0' test na 'DELETE' jr Z,TABDIR and #07 pouze klavesy 1..7,z 8 bude 0 add #80 #80..#87 jsou graficke znaky inc B ret Z bez stisknuteho shiftu:navrat xor #0F graficke znaky v inverzi (#80..#87) ret inc B ret Z kdyz bez shift bit 5,B jinak test na 'CAPS' * *prikazy nad klavesami 0..9 *
03A1 03A4 03A6 03A8 03AA 03AC 03AE 03AF 03B1 03B2 03B4 03B5 03B5 03B5 03B5 03B5 03B5 03B5 03B5 03B5 03B6 03B7 03B9 03BB 03BC 03BE 03BF 03C1 03C5 03C7 03CA 03CC 03CD 03CE 03CF 03D1 03D1 03D2 03D3 03D4 03D5 03D6 03D7 03D9 03DB 03DC 03DF 03DF 03E1 03E3 03E4 03E5 03E7 03E9 03E9 03EA 03EB 03ED 03EE 03EF
21 20 D6 FE 28 FE C0 3E C9 3E C9
ld HL,#0230 jr NZ,TABDIR sub #10 z #30..#39 udela #20..#29 cp #22 testuje na @ (zavinac) jr Z,#03B2 cp #20 testuje na _ (podtrhovatko) ret NZ 5F ld A,#5F '_' (podtrhovatko) ret 40 ld A,#40 '@' (zavinac) ret *============================================================ *rutiny pro reproduktor *============================================================ *reproduktor je aktivovan bitem4 na portu #FE a zapnut, *pokud je na port zaslana 0 *pomoci OUT#FE s bitem4 rovnym 1 je odpojen *rychlost stridani 0 a 1 udava frekvenci tonu * F3 BEEP di klavesnice a hodiny behem BEEP 7D ld A,L nepracuji,aby nebyla narusena CB 3D srl L frekvence CB 3D srl L 2F cpl E6 03 and #03 4F ld C,A 06 00 ld B,#00 DD 21 D1 03 ld IX,#03D1 bazova adresa casove smycky DD 09 add IX,BC 3A 48 5C ld A,(BORDCR) aktualni barva BORDER pri E6 38 and #38 aktivizaci reproduktoru presunuta 0F rrca do bitu 0..2 _A 0F rrca 0F rrca F6 08 or 8 vystup "MIC" odpojen * 00 nop 00 nop 00 nop 04 inc B 0C inc C 0D HALFTI dec C casova smycka pro polovinu 20 FD jr NZ,HALFTI delky cyklu 0E 3F ld C,#3F 05 dec B C2 D6 03 jp NZ,HALFTI * EE 10 xor #10 bit4 invertovan, na D3 FE out (#FE),A reproduktoru stridave 1 a 0 44 ld B,H obnoven _B 4F ld C,A uschovan _A CB 67 bit 4,A stred cyklu ? 20 09 jr NZ,TONCEN ano * 7A ld A,D ne:_DE testovan na 0 B3 or E 28 09 jr Z,TONEND pri _DE=#00 konec BEEP 79 ld A,C obnoveni _A 4D ld C,L vracen obsah _C 1B dec DE pocitadlo smycky -1
30 02 A4 10 22 06 20
03F0 03F2 03F2 03F3 03F4 03F6 03F6 03F7 03F8 03F8 03F8 03F8 03F9 03FA 03FB 03FC 03FD 03FE 0403 0404 0405 0406 0407 0407 040A 040B 040C 040E 040F 0410 0411 0412 0413 0414 0415 0416 0418 0419 041A 041C 041C 041D 041F 0422 0425 0425 0425 0425 0427 0428 042A 042C 042E 042F 0432 0435 0438 0438 0439 043A
DD E9
jp (IX) * 4D TONCEN ld C,L 0C inc C DD E9 jp (IX) * FB TONEND ei C9 ret * *realizace "BEEP" * EF rst CALSW 31 DEFB #31 27 DEFB #27 C0 DEFB #C0 03 DEFB #03 34 DEFB #34 EC 6C 98 1F DEFB #EC #6C #98 04 DEFB #04 A1 DEFB #A1 0F DEFB #0F 38 DEFB #38 * 21 92 5C ld HL,MEMBOT 7E ld A,(HL) A7 and A 20 5E jr NZ,ERRTON 23 inc HL 4E ld C,(HL) 23 inc HL 46 ld B,(HL) 78 ld A,B 17 rla 9F sbc A,A B9 cp C 20 54 jr NZ,ERRTON 23 inc HL BE cp (HL) 20 50 jr NZ,ERRTON * 78 ld A,B C6 3C add #3C F2 25 04 jp P,#0425 E2 6C 04 jp PO,ERRTON * *hledani oktavy tonu (v * 06 FA ld B,#FA 04 OCTAVE inc B D6 0C sub 12 30 FB jr NC,OCTAVE C6 0C add 12 C5 push BC 21 6E 04 ld HL,TONC CD 06 34 call #3406 CD B4 33 call #33B4 * EF rst CALSW 04 DEFB #04 38 DEFB #38
pro vypocet vysky a delky tonu ;dup ;int ;stack->mem0 ;sub ;number #1F #F5 ;multi ;konst 1 ->stack ;add konec kalkulatoru exponent vysledku testovan na 0 nenulovy:chyba znamenko vysledku LSB do _B a _A test zda -128<=vyska<=127 pokud ne:chyba
LSB do _A -60...67 akceptovano chyba preteceni: -128..-61 _B) 6 oktav pod strednim C zacina odecitat 12 tonu na oktavu _A = ukazatel na pulton teto oktavy uschova cisla oktavy bazova adresa pultonu pulton prenesen do _A a na zasobnik kalkulatoru spocitana konecna vyska tonu ;multi ;konec kalk.
043B 043B 043C 043D 043E 043E 043F 0440 0441 0442 0443 0443 0446 0448 044A 044A 044B 044B 044C 044D 044E 044F 0454 0455 0456 0457 0459 045A 045B 045B 045E 045F 0462 0463 0464 0465 0465 0466 0467 0468 0468 0469 046C 046C 046D 046E 046E 046E 046E 0473 0478 047D 0482 0487 048C 0491 0496 049B 04A0 04A5
* F1 86 77 * EF C0 02 31 38 * CD 94 1E FE 0B 30 22 * EF E0 04 E0 34 80 43 55 9F 01 05 34 35 71 03 38 * CD 99 1E C5 CD 99 1E E1 50 59 * 7A B3 C8 * 1B C3 B5 03 CF 0A dec DE jp BEEP * ERRTON rst ERROUT DEFB #0A * *tabulka pultonu * TONC DEFB #89 #02 TONCIS DEFB #89 #0A TOND DEFB #89 #12 TONDIS DEFB #89 #1B TONE DEFB #89 #24 TONF DEFB #89 #2E TONFIS DEFB #89 #38 TONG DEFB #89 #43 TONGIS DEFB #89 #4F TONA DEFB #89 #5C TONB DEFB #89 #69 TONH DEFB #89 #76 jinak _DE -1 a zpracovani tonu 'Integer out of range' ld A,D or E ret Z pokud _DE=0 hned navrat call push call pop ld ld INTEG2 BC INTEG2 HL D,B E,C hodnota parametru casove smycky uschovana hodnota frekvence*cas do _BC a do _DE pro kontrolu rst CALSW vypocet frekvence*cas a uprava na T*F frekvence pro obraz DEFB #E0 ;mem0->stack DEFB #04 ;multi DEFB #E0 ;mem0->stack DEFB #34 ;number->stack DEFB #80 #43 #55 #9F #80 DEFB #01 ;swap DEFB #05 ;divide DEFB #34 ;number DEFB #35 #71 DEFB #03 ;sub DEFB #38 call INTEG1 cp #0B jr NC,ERRTON cas musi byt mensi nez 10 jinak chyba rst DEFB DEFB DEFB DEFB CALSW #C0 #02 #31 #38 ulozeni frekvence do mem0 ;stack->mem0 ;0->stack ;dup ;konec kalk. pop AF add (HL) ld (HL),A vyzvedne cislo oktavy a pricte k exponentu
89 89 89 89 89 89 89 89 89 89 89 89
02 0A 12 1B 24 2E 38 43 4F 5C 69 76
D0 97 D5 90 D0 9D FF FF A7 00 14 F1
12 60 17 41 53 36 49 6A 00 00 F6 10
#D0 #97 #D5 #90 #D0 #9D #FF #FF #A7 #00 #14 #F1
#12 #60 #17 #41 #53 #36 #49 #6A #00 #00 #F6 #10
#86 #75 #1F #02 #CA #B1 #3E #73 #54 #00 #24 #05
04AA 04AA 04AA 04AA 04AD 04B0 04B1 04B4 04B5 04B6 04B7 04BA 04BB 04BC 04BD 04BE 04BF 04C1 04C2 04C2 04C2 04C2 04C2 04C2 04C5 04C6 04C9 04CB 04CD 04D0 04D1 04D2 04D4 04D5 04D7 04D8 04D8 04DA 04DC 04DE 04E0 04E1 04E3 04E4 04E5 04E8 04E8 04E8 04E8 04EA 04EC 04EE 04F0 04F2 04F4 04F6 04F6 04F9 04FA 04FB
CD 3A 87 FA E1 D0 E5 CD 62 6B 0D F8 09 CB C9
FB 24 3B 5C 8A 1C
F1 2B
FE
21 E5 21 CB 28 21 08 13 DD F3 3E 47 10 D3 EE 06 2D 20 05 25 F2
3F 05 80 1F 7F 03 98 0C 2B 02 FE FE 0F A4 F5 D8 04
06 10 D3 3E 06 10 D3
2F FE FE 0D 37 FE FE
01 0E 3B 08 6F C3 07 05
* *tato rutina neni pouzita * call #24FB ld A,(FLAGS) add A jp M,#1C8A pop HL ret NC push HL call #2BF1 ld H,D ld L,E dec C ret M add HL,BC set 7,(HL) ret *============================================================ *podprogramy pro spolupraci s magnetofonem *============================================================ *rutina pro ukladani * ld HL,SAVLOA navratova adresa push HL ld HL,#1F80 konstanta pro 5 sek zavadeci ton bit 7,A jr Z,#04D0 zaznam hlavicky ld HL,#0C98 konstanta pro 2 sek ex AF,AF' uschova oznaceni hlavicka/pgm inc DE dec IX di zakaz preruseni ld A,2 cerveny BORDER a "MIC" zapnut ld B,A * HEADER djnz HEADER perioda pro zavadeci ton out (#FE),A "MIC" pri/od-pojen xor #0F ld B,#A4 konstanta bitove periody dec L jr NZ,HEADER dec B dec H opakovani,dokud _HL>=0 jp P,HEADER * *vysilani synchronizacnich pulsu * ld B,#2F SYNC1 djnz SYNC1 "MIC" odpojen out (#FE),A "MIC" zapnut a cervena ld A,#0D pro "MIC" vypnut a CYAN ld B,#37 SYNC2 djnz SYNC2 out (#FE),A provedeni 'MIC' vypnut a CYAN * ld BC,#3B0E ex AF,AF' znacka hlavicka/pgm obnovena ld L,A a ulozena do _L jp #0507
04FE 04FE 04FF 0500 0502 0505 0506 0507 0508 050A 050B 050E 050E 050F 0511 0511 0512 0514 0514 0516 0518 051A 051C 051E 051E 0520 0522 0523 0524 0525 0525 0525 0525 0527 052A 052A 052B 052D 052F 0531 0533 0534 0535 0536 0537 053A 053C 053E 053F 053F 053F 053F 0540 0543 0545 0546 0547 0548 054A 054C
7A B3 28 DD 7C AD 67 3E 37 C3
0C 6E 00
01 25 05
6C 18 F4 79 CB 78 10 30 06 10 D3 FE 04 42 FE FE
* BYTEOU ld or jr ld ld xor ld ld scf jp * ld jr * BITEND ld bit * BITBEG djnz jr ld BITSET djnz BITOUT out
A,D E Z,#050E L,(IX+0) A,H L H,A A,#01 SAVE8 L,H #0505 A,C 7,B BITBEG NC,BITOUT B,#42 BITSET (#FE),A
_DE testovan na 0 konec bajtu a zaslani "parity" jinak dalsi bajt "parity" -vytvoreno v _A s aktualnim bajtem a ulozeno do _H "MIC" zapnut a modra CARRY jako oznaceni konce pro stanoveni a zaslani 8 bitu konec: "parity" do _L [dil2] zaslani bitu nastaveno ZERO casova smycka kdyz nulovy bit pri jednickovem dalsi zpozdeni [dil1]'MIC' zapnut a modra [dil2]'MIC' vypnut a zluta
06 3E 20 EF 05 AF 3C
CB 15 C2 14 05 1B DD 06 3E DB 1F D0 7A 3C C2 06 10 C9 23 31 7F FE
FE 04 3B FE
F5 3A E6 0F 0F 0F D3 3E DB
48 5C 38
FE 7F FE
ld B,#3E jr NZ,BITEND na dil2 dec B xor A CARRY smazano inc A a "MIC" zapnut a modra *pri prvnim bitu z danneho bajtu je CARRY nastaveno *jinak vzdy nulove. to slouzi pri rotaci _L jako *ohraniceni na 8 bitu SAVE8 rl L bit7 predan do CARRY jp NZ,BITBEG a na odeslani 8 bitu * dec DE pocitadlo bajtu -1 inc IX adresa dalsiho bajtu ld B,#31 ld A,#7F in A,(#FE) test klavesy SPACE-BREAK rra ret NC BREAK stlaceno ld A,D inc A jp NZ,BYTEOU vydej az do _DE=#FFFF ld B,#3B SAVEDE djnz SAVEDE prodleva ret * *po SAVE nebo LOAD obnoveni stavu * SAVLOA push AF uschova CARRY ld A,(BORDCR) original barva BORDER and #38 presunuta rrca do bitu 0..2 rrca rrca out (#FE),A original BORDER ld A,#7F test BREAK in A,(#FE)
054E 054F 0550 0552 0552 0553 0554 0554 0555 0556 0556 0556 0556 0557 0558 0559 055A 055C 055E 0561 0562 0564 0565 0567 0569 056A 056B 056B 056C 056F 0571 0571 0574 0576 0577 0578 0579 057B 057E 0580 0580 0580 0580 0582 0585 0587 0589 058A 058C 058D 058F 058F 058F 058F 0591 0594 0596 0597 0599 059B
1F FB 38 02 * CF 0C * F1 C9
povoleno preruseni BREAK nestlaceno jinak hlaseni 'BREAK - CONT repeats' obnoveni _F
14 08 15 F3 3E D3 21 E5 DB 1F E6 F6 4F BF
0F FE 3F 05 FE 20 02
C0 CD E7 05 30 FA 21 10 2B 7C B5 20 CD 30 15 04 FE
F9 E3 05 EB
06 CD 30 3E B8 30 24 20
9C E3 05 E4 C6 E0 F1
06 CD 30 78 FE 30 CD
C9 E7 05 D5 D4 F4 E7 05
* *tato rutina je volana pri LOAD a VERIFY * inc D nulovani ZERO ex AF,AF' a uschova dec D puvodni _D di zakaz preruseni ld A,#0F bily BORDER out (#FE),A ld HL,SAVLOA navratova adresa push HL na zasobnik in A,(#FE) cteni portu rra and #20 pro sledovani bitu 'EAR' or #02 cerveny BORDER ld C,A uschovan (#22=vypnuto,#02=zapnuto) cp A * LOABRK ret NZ opusteni pri BREAK LOABEG call SIGN1 CARRY nulove:bez impulsu nebo BREAK jr NC,LOABRK * ld HL,#0415 LDWAIT djnz LDWAIT prodleva asi 1 sekundu dec HL ld A,H or L jr NZ,LDWAIT call SIGN2 cekani na dalsi 2 impulsy jr NC,LOABRK pokud ne:chyba * *akceptovan pouze zavadeci signal * HEADIN ld B,#9C casova konstanta call SIGN2 ocekavani dalsich 2 impulsu jr NC,LOABRK pokud neprijdou:chyba ld A,#C6 maximalni casovy odstup cp B cca 3000 TV cyklu jr NC,LOABEG jinak znovu hledani nahravky inc H ocekava se 256 impulsu jr NZ,HEADIN * *nyni je ocekavan synchronizacni impuls * SYNWAI ld B,#C9 casova konstanta call SIGN1 jr NC,LOABRK ld A,B dva kratke nasledujici signaly cp #D4 tvori synchron impuls jr NC,SYNWAI call SIGN1 synchron impuls
059E 059F 059F 059F 059F 05A0 05A2 05A3 05A5 05A7 05A9 05A9 05AA 05AC 05AE 05B1 05B3 05B5 05B6 05B7 05B7 05B8 05B9 05BA 05BB 05BD 05BD 05C0 05C1 05C2 05C2 05C4 05C5 05C6 05C8 05CA 05CA 05CD 05CE 05D0 05D1 05D3 05D5 05D8 05D8 05D9 05DA 05DB 05DC 05DD 05DF 05E0 05E2 05E3 05E3 05E3 05E3 05E3 05E3 05E3
D0
79 EE 4F 26 06 18 08 20 30 DD 18 CB AD C0
03 00 B0 1F 07 0F 75 00 0F 11
79 1F 4F 13 18 07 DD 7E 00 AD C0 DD 23 1B 08 06 B2 2E 01 CD D0 3E B8 CB 06 D2 E3 05 CB 15 B0 CA 05
7C AD 67 7A B3 20 CA 7C FE 01 C9
CD E7 05
ret NC musi existovat * *bajty mohou byt ukladany nebo VERIFikovany * ld A,C zmena BORDER na modrou xor #03 nebo zlutou ld C,A ld H,#00 pro test "parity" ld B,#B0 casova konstanta pro bajt "FLAG" jr #05C8 * ex AF,AF' obnoveni _F jr NZ,#05B3 pouze pri testu "FLAG" (1.bajt) jr NC,VERIFY ld (IX+0),L nahrany bajt ulozen do pameti jr LOAWAI a nahravan dalsi LOAFLG rl C uschova CARRY xor L prvni bajt=typ-flag ? ret NZ ne:chyba * ld A,C jinak obnoveni CARRY rra ld C,A inc DE tato inkrementace bude anulovana jr #05C4 * VERIFY ld A,(IX+0) pri VERIFY je puvodni bajt xor L porovnan s nahranym ret NZ pri chybe (CARRY nulove) * LOAWAI inc IX posun adresy pro LOAD/VERIFY dec DE pocitadlo -1 ex AF,AF' uschova _F ld B,#B2 casova konstanta ld L,#01 koncova znacka pri 9. posunu * BITGET call SIGN2 doda delku impulsu ret NC pri prekroceni casu ld A,#CB porovnani casu, k tomu cp B 0 nebo 1 do CARRY rl L a odtud do _L ld B,#B0 casova konstanta pro dalsi bit jp NC,BITGET pokud je bajt neuplny * ld A,H prevzeti "parity" xor L a vytvoreni nove podle aktual.bitu ld H,A tato ulozena zpet do _H ld A,D or E jr NZ,#05A9 pocitadlo>0:dalsi bajty ld A,H posledni "parity" musi byt 0 a cp #01 CARRY nastaveno ret jinak pokud CARRY nulove: chyba * *tento podpgm zachyti zmenu urovne napeti (impuls) *na vstupu "EAR" *_B slouzi jako casomira. behem stanovene doby se musi *vyskytnout pozadovany impuls, jinak chyba (pozn.CARRY=0) * SIGN2 call SIGN1 test na dva impulsy
05E6 05E7 05E7 05E9 05EA 05EC 05ED 05EE 05EF 05EF 05F1 05F3 05F4 05F5 05F5 05F6 05F8 05FA 05FA 05FA 05FA 05FB 05FC 05FD 05FF 0601 0603 0604 0605 0605 0605 0605 0605 0606 0609 060B 060E 0611 0614 0616 0619 061C 061D 061F 0621 0622 0623 0625 0627 0629 062A 062B 062D 062D 0631 0634 0637 0638 0639 063A
D0
ret NC navrat pri chybe * 3E 16 SIGN1 ld A,#16 test na jeden impuls 3D WAITLD dec A mala prodleva 20 FD jr NZ,WAITLD A7 and A smazani CARRY 04 SIGN inc B casovy citac +1 C8 ret Z konec casu :CARRY i ZERO nastaveny * 3E 7F ld A,#7F DB FE in A,(#FE) cteni klavesy BREAK a vstupu "EAR" 1F rra BREAK stlaceno: D0 ret NC CARRY nulove, ZERO nikoliv * A9 xor C vyskytl se impuls ? E6 20 and #20 28 F3 jr Z,SIGN ne: znovu test * *behem vyhrazeneho casu prijat impuls * 79 ld A,C 2F cpl do _C zaznam urovne signalu 4F ld C,A E6 07 and 7 vykryti barvy BORDER F6 08 or 8 "MIC" vypnut D3 FE out (#FE),A 37 scf CARRY nastaveno:O.K. C9 ret * *vstup LOAD,SAVE,VERIFY,MERGE *rozliseni prostrednictvim >TADDR< * F1 CCMAIN pop AF odstraneni navratove adresy 3A 74 5C ld A,(TADDR) do >TADDR< 0 pro SAVE D6 E0 sub #E0 1 pro LOAD,2 pro VERIFY 32 74 5C ld (TADDR),A 3 pro MERGE CD 8C 1C call #1C8C parametr nazvu na calcstack CD 30 25 call CHESYN kontrola syntaxe ? 28 3C jr Z,#0652 skok,pokud pouze kontola syntaxe 01 11 00 ld BC,17 delka nazvu = 17 znaku 3A 74 5C ld A,(TADDR) (10 jmeno,7 dalsi udaje) A7 and A 28 02 jr Z,CCSPA pri SAVE 0E 22 ld C,34 jinak delka 34 bajtu F7 CCSPA rst REST30 rezervace mista D5 push DE pocatecni adresa z _DE DD E1 pop IX predana do _IX 06 0B ld B,11 3E 20 ld A,' ' 12 CLRNAM ld (DE),A vymazani jmena souboru 13 inc DE 10 FC djnz CLRNAM * DD 36 01 FF ld (IX+1),255 pozn:bez jmena CD F1 2B call #2BF1 prevezme parametry jmena 21 F6 FF ld HL,#FFF6 = -10 0B dec BC 09 add HL,BC test delky na 10 03 inc BC 30 0F jr NC,#064B <=10
063C 063F 0640 0642 0642 0643 0644 0644 0645 0646 0648 064B 064D 064E 064F 0650 0652 0652 0653 0655 0657 065A 065C 065F 0660 0663 0665 0667 066A 066D 066E 0670 0670 0671 0672 0672 0675 0678 067A 067B 067C 067F 0680 0681 0684 0685 0688 068A 068C 068E 068F 0692 0693 0694 0696 0698 0699 069C 069D 06A0
3A 74 5C A7 20 02 CF 0E 78 B1 28 01 DD E1 23 EB ED DF FE 20 3A FE CA E7 CD CB 30 21 3A 3D 28 CF 01 C2 CD 28 23 7E DD 23 7E DD 23 DD 3E CB 28 3C DD EB E7 FE 20 E7 CD EB C3 8A 1C 30 25 18 77 0B 77 0C 71 0E 01 71 01 77 00 29 DA EE 1B 5A 07
ld A,(TADDR) and A jr NZ,NAMEOK * NAMERR rst DEFB * NAMEOK ld or jr ld push pop inc ex ldir * rst cp jr ld cp jp rst call set jr ld ld dec jr * rst DEFB * jp call jr inc ld ld inc ld ld inc ld ld bit jr inc ld ex rst cp jr rst call ex jp * ERROUT #0E A,B C Z,#0652 BC,10 IX HL HL DE,HL GETACT #E4 NZ,#06A0 A,(TADDR) 3 Z,#1C8A GETNXT #28B2 7,C NC,#0672 HL,#0000 A,(TADDR) A Z,#0685 ERROUT #01 NZ,#1C8A CHESYN Z,#0692 HL A,(HL) (IX+#0B),A HL A,(HL) (IX+#0C),A HL (IX+#0E),C A,1 6,C Z,#068F A (IX+0),A DE,HL GETNXT ')' NZ,#0672 GETNXT SYNTX DE,HL #075A
jestlize nejde o SAVE, nastavi ZERO a je povolen delsi nazev hlaseni 'invalid file name'
0A 0A 00 E5
B0 E4 49 74 5C 03 8A 1C B2 28 F9 0B 00 00 74 5C 15
bez udaje o nazvu jmeno ohranici na 10 znaku adresa jmena do _HL a posunuti ukazatele o 1 misto zamena ukazatelu ulozeni nazvu prisune dalsi znak prikazu token 'DATA' ? ne test na MERGE MERGE & DATA:chyba prisunut dalsi znak hledani v tabulce promennych nastavi bit7 jmena pole pri definovanem poli jinak nove pole pri LOAD:skok jinak chyba 'variable not found'
skok pri kontrole syntaxe jinak delku (LSB) (MSB) ulozi do pracovniho prostoru ulozen nazev a typ pole implicitne: ciselne pole pokud je to numericke pole:skok jinak: retezcove pole druh poznacen do 1.bajtu hlavicky uschova _HL prisune dalsi znak test na uzaviraci zavorku kdyz ne:chyba >CHADD<+1,dalsi znak opusteni pri kontrole syntaxe obnoveni _HL a dalsi zpracovani
06A0 06A2 06A4 06A7 06A9 06AC 06AD 06B0 06B4 06B8 06BB 06BE 06C1 06C3 06C3 06C5 06C7 06CA 06CC 06CF 06D0 06D3 06D5 06D8 06D9 06DC 06DF 06E1 06E1 06E1 06E1 06E4 06E5 06E7 06E9 06EC 06ED 06F0 06F3 06F5 06F5 06F6 06F9 06F9 06FC 06FC 06FF 0702 0705 0708 070B 070E 070F 0710 0714 0716 0716 0718 071A 071D
FE 20 3A FE CA E7 CD DD DD 21 DD DD 18 FE 20 3A FE CA E7 CD 20 3A A7 CA CD 18
AA 1F 74 5C 03 8A 1C EE 36 36 00 75 74 4D 1B 0B 00 0C 1B 40 0D 0E * AF 4F 74 5C 03 8A 1C 48 20 0C 74 5C 8A 1C E6 1C 0F
#AA NZ,#06C3 A,(TADDR) 3 Z,#1C8A GETNXT SYNTX (IX+#0B),0 (IX+#0C),#1B HL,#4000 (IX+#0D),L (IX+#0E),H #0710 #AF NZ,#0716 A,(TADDR) 3 Z,#1C8A GETNXT #2048 NZ,#06E1 A,(TADDR) A Z,#1C8A #1CE6 #06F0
token 'SCREEN$' ? ne:skok pri MERGE neni 'SCREEN$' povoleno dalsi znak opusteni pri kontrole syntaxe rozsah VIDEORAM + rozsah ATTR je #1B00 pocatecni adresa video RAM
token 'CODE' ? ne:skok pri MERGE neni 'CODE' povoleno dalsi znak kontrola,zda konec zadani ne pri SAVE neni samotne 'CODE' povoleno zapsani 0 na calcstack pro start
CD DF FE 28 3A A7 CA CD 18 E7 CD CD CD DD DD CD DD DD 60 69 DD 18 FE 28 CD DD
* *vyhledani pocatecni adresy * 82 1C call #1C82 doda prvni cislo rst GETACT prevzeti znaku 2C cp ',' test na carku 0C jr Z,#06F5 ano:cislo bylo pocatecni adresa 74 5C ld A,(TADDR) pokud pri SAVE and A je zadana pouze pocatecni adresa: 8A 1C jp Z,#1C8A chyba E6 1C call #1CE6 0 jako delka na calcstack 04 jr #06F9 * rst GETNXT dalsi znak 82 1C call #1C82 a urceni delky * EE 1B call SYNTX pri ko.syntaxe k dalsimu prikazu * 99 1E call INTEG2 prevede delku do _BC 71 0B ld (IX+#0B),C a ulozi ji 70 0C ld (IX+#0C),B do hlavicky 99 1E call INTEG2 totez provede 71 0D ld (IX+#0D),C s pocatecni adresou 70 0E ld (IX+#0E),B ld H,B pocatecni adresa take do _HL ld L,C jako ukazovatko 36 00 03 ld (IX+0),3 typ "3" pro 'SCREEN$' a 'CODE' 44 jr #075A * CA cp #CA token 'LINE' ? 09 jr Z,#0723 ano EE 1B call SYNTX pri ko.syntaxe na dalsi prikaz 36 0E 80 ld (IX+#0E),#80
0721 0723 0723 0726 0727 072A 072B 072E 0731 0734 0737 073A 073E 073E 0741 0745 0746 0748 074B 074E 0751 0753 0756 0759 075A 075A 075A 075A 075A 075A 075A 075A 075D 075E 0761 0761 0762 0765 0767 0769 076C 076D 076E 0771 0773 0775 0777 077A 077E 0780 0783 0786 0788 078A 078C 078E 078E 0791 0792 0795
18 17 * 3A A7 C2 E7 CD CD CD DD DD DD 2A ED 37 ED DD DD 2A ED DD DD EB 74 5C 8A 1C 82 EE 99 71 70 36 1C 1B 1E 0D 0E 00 00 * 59 5C 5B 53 5C 52 75 74 4B 52 75 74 0B 0C 5C 0F 10
#073A A,(TADDR) A NZ,#1C8A GETNXT #1C82 SYNTX #1E99 (IX+#0D),C (IX+#0E),B (IX+0),0 HL,(ELINE) DE,(PROG) HL,DE (IX+#0B),L (IX+#0C),H HL,(VARS) HL,DE (IX+#0F),L (IX+#10),H DE,HL
pokud zadny dalsi parametr kontrola,zda SAVE, nebot pri nem musi cislo radku existovat nejde o SAVE na dalsi znak cislo radku na calcstack opusteni pri kontrole syntaxe jinak cislo radku do _BC a do hlavicky 'LINE' bez udaje je typ "0" ukazatel na konec promennych ukazatel na zacatek Basic pgmu delka pgmu a promennych do hlavicky jen delka pgmu spocitana a ulozena do hlavicky
pocatek pgmu do _HL * *tim je hlavicka pripravena *IX+0 :typ *IX+1..10 :jmeno (pokud bez jmena: IX+1=#FF) *IX+11..12:delka *IX+13..16:ruzne udaje * 3A 74 5C ld A,(TADDR) test,zda jde o SAVE A7 and A CA 70 09 jp Z,#0970 ano * E5 push HL ukazatel pro LOAD atd. uschovan 01 11 00 ld BC,17 DD 09 add IX,BC vypocet adresy druhe hlavicky DD E5 push IX a ulozeni na zasobnik 11 11 00 ld DE,17 pro 17 bajtu hlavicky AF xor A pozn:"header" 37 scf pozn:LOAD CD 56 05 call #0556 prevzeti hlavicky DD E1 pop IX obnoveni adresy hlavicky 30 F2 jr NC,#0767 a cekani ve smycce,dokud neprijde 3E FE ld A,#FE hlavicka CD 01 16 call OPCAN otevren kanal -SFD 36 52 03 ld (SCRCT),3 pri vypisu jmena bez dotazu scroll? 0E 80 ld C,#80 implicitne: "jina hlavicka" DD 7E 00 ld A,(IX+0) porovnani obou hlavicek DD BE EF cp (IX+#EF) 20 02 jr NZ,#078A neni to hledana 0E F6 ld C,#F6 musi souhlasit 10 znaku FE 04 cp 4 typ > 4 je nesmysl 30 D9 jr NC,#0767 dalsi hledani hlavicky z pasku * 11 C0 09 ld DE,#09C0 bazova adresa hlaseni C5 push BC uschova _BC CD 0A 0C call PRTREP vypis typu na obrazovku C1 pop BC obnoveni _BC
0796 0798 0799 079C 079D 079F 07A0 07A1 07A3 07A4 07A5 07A6 07A6 07A7 07A8 07A9 07AA 07AC 07AD 07AE 07B0 07B2 07B4 07B4 07B4 07B4 07B6 07B7 07B8 07BB 07BD 07BF 07C2 07C3 07C6 07C8 07CB 07CB 07CB 07CB 07CC 07CF 07D2 07D5 07D8 07D9 07DA 07DC 07DE 07E0 07E0 07E2 07E5 07E7 07E9 07E9 07EA 07EB 07EC 07EE
DD D1 21 19 06 7E 3C 20 79 80 4F 13 1A BE 23 20 0C D7 10 CB 20
E5 F0 FF 0A 03
push pop ld add ld ld inc jr ld add ld * inc ld cp inc jr inc rst djnz bit jr
IX DE HL,#FFF0 HL,DE B,10 A,(HL) A NZ,#07A6 A,C B C,A DE A,(DE) (HL) HL NZ,#07AD C PRTOUT #07A6 7,C NZ,#0767
na nahranou hlavicku ukazuje nyni _DE na prvni hlavicku ukazuje _HL kontrolovano 10 znaku bylo zadano jmeno ? ano pokud ne:souhlasi vzdy (#F6+#0A=#00) porovnani jednoho znaku (na jeden ukazuje _HL,na druhy _DE) hlavicka nesouhlasi:skok jinak pocitadlo +1 vypisuje se jmeno dokud se nevynuluje _B kdyz hlavicka souhlasi,je _C>0 jinak hledani dalsi na pasce
01 F6 79 B3
3E D7 E1 DD FE 28 3A 3D CA FE CA
0D 7E 00 03 0C 74 5C 08 08 02 B6 08
E5 DD DD DD DD 7C B5 28 ED 38 28 DD FE 20
6E 66 5E 56 0D 52 26
FA FB 0B 0C
07 7E 00 03 1D
E1 7C B5 20 06 DD 6E 0D
* *pokracuje az do nalezeni spravne hlavicky * ld A,#0D navrat vozu (ENTER) rst PRTOUT vypsan pop HL obnoveni ukazatele ld A,(IX+0) 'SCREEN$' nebo 'CODE' ? cp 3 jr Z,#07CB ano ld A,(TADDR) prikaz 'LOAD' ? dec A jp Z,#0808 ano cp 2P prikaz 'MERGE' ? jp Z,#08B6 ano * *rutina VERIFY * push HL uschova ukazatele ld L,(IX+#FA) delka prevzata do _HL ld H,(IX+#FB) ld E,(IX+#0B) delka nahrane hlavicky do _DE ld D,(IX+#0C) ld A,H byl udaj delky v zadani nulovy ? or L jr Z,#07E9 ano sbc HL,DE kdyz nova delka vetsi nez stara jr C,#0806 pak chyba * jr Z,#07E9 porovnani delek je v poradku ld A,(IX+0) pri VERIFY se musi cp 3 delky shodovat jr NZ,#0806 jinak chyba * pop HL vyzvednuti ukazatele na zacatek ld A,H a test na 0 or L jr NZ,#07F4 ld L,(IX+#0D) pokud start=0,potom
07F1 07F4 07F5 07F7 07FA 07FC 07FD 07FF 0800 0802 0802 0802 0802 0805 0806 0806 0807 0808 0808 0808 0808 080B 080E 080F 0810 0811 0813 0814 0815 0816 0817 0819 0819 081C 081F 0820 0821 0823 0825 0825 0828 0829 082A 082B 082E 082E 082F 0832 0833 0835 0836 0837 0839 083A 083B 083C 083D 083E 083F 0840
DD E5 DD 3A FE 37 20 A7 3E
66 0E E1 74 5C 02 01 FF
je pouzit pocatek z nahrane hlavicky pocatek preveden do _IX LOAD nebo VERIFY rozliseny takto: CARRY nastaveno ='LOAD' (pri LOAD) CARRY smazano ='VERIFY' oznaceni bloku dat
CD 56 05 D8 CF 1A
DD DD E5 7C B5 20 13 13 13 EB 18 DD DD EB 37 ED 38
5E 0B 56 0C
06
0C 6E FA 66 FB 52 09
11 05 00 19 44 4D CD 05 1F E1 DD 7E 00 A7 28 3E 7C B5 28 13 2B 46 2B 4E 2B 03 03 03
* *tento podpgm pouziva LOAD,MERGE i VERIFY * call #0556 ret C navrat,pokud nenastala chyba * rst ERROUT hlaseni DEFB #1A 'tape loading error' * *rutina prikazu 'LOAD' * ld E,(IX+#0B) delka z nahrane hlavicky do _DE ld D,(IX+#0C) push HL uschova ukazatele na konec ld A,H pro nedeklarovane pole je _HL=0 or L jr NZ,#0819 neni tomu tak inc DE _DE+3 pro jmeno a delku inc DE inc DE ex DE,HL zamena ukazatelu jr #0825 * ld L,(IX+#FA) delka pgmu a promennych ld H,(IX+#FB) ex DE,HL test, zda bude potreba dalsi pamet scf sbc HL,DE jr C,#082E ne * ld DE,5 5 bajtu navic add HL,DE ld B,H vysledek do _BC ld C,L call #1F05 kontrola volneho mista * pop HL pocatecni hodnota ld A,(IX+0) kontrola,zda bude nahravan BASIC and A jr Z,#0873 ano ld A,H or L nove pole ? jr Z,#084C ano dec HL jinak delka jiz existujiciho pole ld B,(HL) do _BC dec HL ld C,(HL) dec HL _HL ukazuje na stare jmeno inc BC posun ukazatele inc BC pro jmeno a delku inc BC
0841 0845 0848 084C 084C 084F 0850 0853 0856 0857 0858 0859 085A 085D 085E 0861 0862 0863 0864 0865 0866 0867 0868 0869 086A 086B 086D 086E 0870 0873 0873 0873 0873 0874 0877 0878 087C 087F 0882 0883 0886 0887 0888 0889 088C 0890 0891 0894 0897 0898 089B 089E 089F 08A1 08A3 08A6 08A9 08AD 08AD 08AE
DD 22 5F 5C CD E8 19 DD 2A 5F 5C * 2A 2B DD DD C5 03 03 03 DD F5 CD 23 F1 77 D1 23 73 23 72 23 E5 DD 37 3E C3 59 5C 4E 0B 46 0C
ld (XPTR),IX call OUT2 ld IX,(XPTR) ld dec ld ld push inc inc inc ld push call inc pop ld pop inc ld inc ld inc push pop scf ld jp HL,(ELINE) HL C,(IX+#0B) B,(IX+#0C) BC BC BC BC A,(IX+#FD) AF MAKESP HL AF (HL),A DE HL (HL),E HL (HL),D HL HL IX A,#FF #0802
ulozeni _IX zruseno stare pole obnoveno _IX _HL na koncovou znacku (#80) oblasti promennych Basicu delka noveho pole do _BC a ulozena na zasobnik _BC+3 pro jmeno a delku jmeno ze stare hlavicky pro nove pole na zasobnik vyhrazeno (_BC) bajtu jmeno pole vyzvednuto a vepsano totez s delkou
7E FD 55 16
E1 FF 02 08
_HL ukazuje na prvni misto,kam se bude nahravat tato adresa prepsana do _IX pozn:'LOAD' pozn:"telo nahravky" promennymi uschova koncove adresy ukazatel na konec promennych uschova bazove adresy delka nove hlavicky a uschovana zrusen stavajici pgm v pameti obnovena delka pocatecni adresa ulozena pod delku vyhrazeno (_BC) bajtu pameti obnoveno _IX nyni se musi upravit >VARS<
* *nahravani BASIC pgmu s * EB ex DE,HL 2A 59 5C ld HL,(ELINE) 2B dec HL DD 22 5F 5C ld (XPTR),IX DD 4E 0B ld C,(IX+#0B) DD 46 0C ld B,(IX+#0C) C5 push BC CD E5 19 call OUT1 C1 pop BC E5 push HL C5 push BC CD 55 16 call MAKESP DD 2A 5F 5C ld IX,(XPTR) 23 inc HL DD 4E 0F ld C,(IX+#0F) DD 46 10 ld B,(IX+#10) 09 add HL,BC 22 4B 5C ld (VARS),HL DD 66 0E ld H,(IX+#0E) 7C ld A,H E6 C0 and #C0 20 0A jr NZ,#08AD DD 6E 0D ld L,(IX+#0D) 22 42 5C ld (NEWPPC),HL FD 36 0A 00 ld (NSPPC),0 * D1 pop DE DD E1 pop IX
zadano cislo radku pro autostart ? ne:skok jinak toto cislo prepsano do >NEWPPC< a nulovano >NSPPC< vyzvednuta delka a pocatecni adresa
08B0 08B1 08B3 08B6 08B6 08B6 08B6 08B9 08BC 08BD 08BE 08BF 08C1 08C2 08C3 08C4 08C5 08C7 08C8 08CA 08CD 08CE 08D2 08D2 08D2 08D2 08D3 08D5 08D7 08D7 08D8 08D9 08DA 08DB 08DD 08DE 08DF 08E0 08E1 08E3 08E4 08E5 08E8 08E9 08EB 08EB 08EE 08F0 08F0 08F0 08F0 08F1 08F2 08F4 08F5 08F5 08F6 08F9 08FA 08FC
37 3E FF C3 02 08
* *rutina 'MERGE' * DD 4E 0B ld C,(IX+#0B) delka nahravky DD 46 0C ld B,(IX+#0C) C5 push BC na zasobnik (pozdeji do _DE) 03 inc BC F7 rst REST30 vyhrazeno delka+1 bajtu pameti 36 80 ld (HL),#80 a vlozena koncova znacka EB ex DE,HL pocatecni adresa do _HL D1 pop DE delka bloku do _DE E5 push HL zacatek ulozen na zasobnik E5 push HL a jeste DD E1 pop IX predan do _IX 37 scf pozn:nahravani 3E FF ld A,#FF pozn:"telo nahravky" CD 02 08 call #0802 volana nahravaci rutina E1 pop HL zacatek opet do _HL ED 5B 53 5C ld DE,(PROG) _DE ukazuje na puvodni zacatek * *nove radky budou zarazeny do puvodniho pgmu * 7E ld A,(HL) test, zda E6 C0 and #C0 hotovo 20 19 jr NZ,#08F0 ano * 1A ld A,(DE) porovnavano cislo radku (MSB) 13 inc DE a oba ukazatele +1 BE cp (HL) 23 inc HL 20 02 jr NZ,#08DF nerovno:skok 1A ld A,(DE) nyni porovnavan LSB BE cp (HL) 1B dec DE oba ukazatele na puvodni hodnotu 2B dec HL 30 08 jr NC,#08EB misto pro novy radek nalezeno E5 push HL jinak hledani zacatku EB ex DE,HL dalsiho radku CD B8 19 call #19B8 E1 pop HL 18 EC jr #08D7 znovu hledani ve starem pgmu * CD 2C 09 call #092C novy radek vsunut 18 E2 jr #08D2 a dalsi hledani * *vkladani novych promennych * 7E ld A,(HL) nazev promenne 4F ld C,A FE 80 cp #80 hotovo (koncova znacka) ? C8 ret Z ano * E5 push HL aktualni novy ukazatel 2A 4B 5C ld HL,(VARS) stary ukazatel 7E ld A,(HL) precten nazev promenne FE 80 cp #80 a test,zda konec 28 25 jr Z,#0923 dosazeni konce
08FE 08FF 0901 0902 0905 0906 0907 0909 0909 090B 090D 090F 0910 0911 0912 0912 0913 0914 0915 0916 0918 0919 091B 091C 091E 091E 091F 0921 0921 0923 0923 0924 0925 0926 0927 092A 092C 092C 092C 092C 092E 092F 0932 0933 0936 0939 093A 093D 093E 093F 0940 0943 0946 0949 094A 094B 094C 094E 094F 0952
B9 28 08 C5 CD B8 19 C1 EB 18 F0 * E6 E0 FE A0 20 12 D1 D5 E5 * 23 13 1A BE 20 06 17 30 F7 E1 18 03 * E1 18 E0 * 3E FF D1 EB 3C 37 CD 2C 09 18 C4
cp jr push call pop ex jr and cp jr pop push push inc inc ld cp jr rla jr pop jr
C Z,#0909 BC #19B8 BC DE,HL #08F9 #E0 #A0 NZ,#0921 DE DE HL HL DE A,(DE) (HL) NZ,#091E NC,#0912 HL #0921
souhlasi nazev ? ano uschova nazvu promenne hledani dalsi stare promenne obnoveni nazvu ukazatele opet ve svych registrech a znovu hledani dlouhy nazev promenne ? ne _DE ukazuje na prvni pismeno noveho nazvu uschova ukazatele na stare jmeno ukazatel+1,protoze prvni bajt jiz byl porovnan zbytek nazvu overovan pri neshode posledni znak ? ne:dalsi adresa stareho nazvu
pop HL jr #0901 ld pop ex inc scf call jr * *podpgm pro * jr ex ld ex call call ex ld ex ex push call ld ld ex push ex jr dec call inc A,#FF DE DE,HL A #092C #08F0
dalsi hledani pozn:hodnota promenne prepsana _A=#80:promenna zavedena nova adresa pri prepsani promenne ZERO=1 pozn:promenna zpracovana a provede se jeji vlozeni prosetreni dalsi promenne
vlozeni radku/promenne pri 'MERGE' NZ,#093E AF,AF' (XPTR),HL DE,HL #19B8 OUT2 DE,HL HL,(XPTR) AF,AF' AF,AF' DE #19B8 (XPTR),HL HL,(PROG) (SP),HL BC AF,AF' C,#0955 HL MAKESP HL pridani uschova _F "novy" ukazatel ulozen hledani dalsiho radku/promenne stary radek/promenna odstraneny ukazatele a _F obnoveny _F ale zase ulozen uschova koncove adresy hledan dalsi radek/promenna a delka "novy" radek/promenna uschovany >PROG< na zasobnik a "novy" ukazatel obnoven uschova delky vraceni _F pokud nova promenna:skok jinak vyhrazeni mista
20 08 22 EB CD CD EB 2A 08 08 D5 CD 22 2A E3 C5 08 38 2B CD 23
10 5F 5C B8 19 E8 19 5F 5C
B8 19 5F 5C 53 5C
07 55 16
0953 0955 0955 0958 0959 095A 095B 095F 0963 0964 0965 0966 0968 0969 096A 096B 096E 096F 0970 0970 0970 0970 0971 0973 0976 0977 097A 097D 0981 0984 0986 0989 098A 098D 098F 0991 0992 0994 0997 099A 099C 099E 09A1 09A1 09A1 09A1 09A2 09C1 09CB 09DA 09EC 09F4 09F4 09F4 09F4 09F4 09F7 09F9 09FC 09FE
18 03 * CD 23 C1 D1 ED ED C5 D5 EB ED E1 C1 D5 CD D1 C9 55 16
jr call inc pop pop ld ld push push ex ldir pop pop push call pop ret
#0958 MAKESP HL BC DE (PROG),DE DE,(XPTR) BC DE DE,HL HL BC DE OUT2 DE vyhrazeni mista pro novou promennou prvni volne misto prevzeti delky prevzeti >PROG< zapsani hodnoty do system.promenne "novy" ukazatel nacten delka a "novy" ukazatel ulozen ukazatele ve svych registrech prekopirovani radku/promenne "novy" ukazatel delka radku/promenne uschova "stareho" ukazatele radek/promenna z prac. prostoru obnoveni "stareho" ukazatele hotovo
53 53 5C 5B 5F 5C
B0
E8 19
E5 3E CD AF 11 CD FD CD DD 11 AF CD DD 06 76 10 DD DD 3E DD C3
FD 01 16 A1 0A CB D4 E5 11 09 0C 02 EE 15 00
C2 04 E1 32 FD 5E 0B 56 0C FF E1 C2 04
80 53 0D 0D 0D 0D
74 50 4E 43 42
61 72 75 68 79
72 6F 6D 61 74
CD FE D2 FE 38
03 0B 20 D9 0A 06 69
* *podpgm pro 'SAVE' * push HL uschova ukazatele ld A,#FD otevreni kanalu -Kcall OPCAN xor A _A=0 pro prvni hlaseni ld DE,CCREP adresa hlaseni pri praci s MGF call PRTREP vypis 'start tape ...' set 5,(TVFLAG) pozn:obrazovka smazana call WAITA ceka na stisk tlacitka push IX uschova adresy hlavicky ld DE,17 17 bajtu hlavicky xor A (_A=0 : hlavicka) call #04C2 musi byt zaznamenano pop IX obnoveni adresy hlavicky ld B,50 konstanta pro prodlevu halt djnz #0991 1 sekunda ld E,(IX+#0B) do _DE delka zaznamu ld D,(IX+#0C) ld A,#FF _A=#FF oznaceni "tela nahravky" pop IX zacatek bloku jp #04C2 zaznam na MGF * *hlaseni pro spolupraci s mgf * CCREP DEFB #80 DEFB 'Start tape, then press any key' #AE DEFB #0D 'Program:' #A0 DEFB #0D 'Number array:' #A0 DEFB #0D 'Character array' #A0 DEFB #0D 'Bytes:' #A0 * *============================================================ *rutiny pro vypis znaku na obrazovku a tiskarnu * GIVOUT call POSGET doda PRINT pozici cp ' ' znak s CODE vyssim nez #1F ? jp NC,PRTCHA ano cp 6 vypis #00..#05 ? jr C,PRTQUE ano:vypise otaznik
0A00 0A02 0A04 0A07 0A08 0A0A 0A0B 0A0C 0A0C 0A0D 0A0E 0A11 0A11 0A11 0A11 0A12 0A13 0A14 0A15 0A16 0A17 0A18 0A19 0A1A 0A1B 0A1C 0A1D 0A1E 0A1F 0A20 0A21 0A22 0A23 0A23 0A23 0A23 0A23 0A23 0A24 0A26 0A27 0A29 0A2D 0A2F 0A30 0A32 0A34 0A35 0A37 0A38 0A3A 0A3D 0A3D 0A3D 0A3D 0A3D 0A3D 0A40 0A41 0A45
FE 30 21 5F 16 19 5E
18 65 0B 0A 00
cp jr ld ld ld add ld
rovnez pro #18..#1F vypise otaznik adresa tabulky ridicich znaku -6 tedy pro #06..#17 vypocet absolutni adresy v tabulce hodnota z tabulky = ofset pro adresu vykonne rutiny vypocte absolutni adresu rutiny a ulozi ji na zasobnik
19 E5 C3 03 0B
* *vyrovnavaci tabulka pro ridici znaky * 4E CONTRO DEFB #4E PRINT comma 57 DEFB #57 ? 10 DEFB #10 kurzor doleva 29 DEFB #29 kurzor doprava 54 DEFB #54 ? 53 DEFB #53 ? 52 DEFB #52 ? 37 DEFB #37 ENTER 50 DEFB #50 ? 4F DEFB #4F ? 5F DEFB #5F INK control 5E DEFB #5E PAPER control 5D DEFB #5D FLASH control 5C DEFB #5C BRIGHT control 5B DEFB #5B INVERSE control 5A DEFB #5A OVER control 54 DEFB #54 AT control 53 DEFB #53 TAB control * *kurzor doleva *_B =cislo radku,_C =cislo sloupce *(pocitano zespoda a zprava !!!) * 0C inc C o 1 doleva 3E 22 ld A,34 dosazeno okraje radku ? B9 cp C 20 11 jr NZ,#0A3A ne:skok FD CB 01 4E bit 1,(FLAGS) vypis na tiskarnu ? 20 09 jr NZ,#0A38 ano:skok 04 inc B jinak o jeden radek vyse 0E 02 ld C,2 sloupec na 2 : tzn na posledni 3E 18 ld A,24 dosazeno horniho okraje obrazovky ? B8 cp B 20 03 jr NZ,#0A3A ne:skok 05 dec B ano:stejny radek jako predtim 0E 21 ld C,33 a nastaven prvni sloupec C3 D9 0D jp #0DD9 * *kurzor doprava *_B =cislo radku,_C =cislo sloupce *(tato rutina odpovida v BASICu : PRINT OVER 1;CHR$ 32;) * 3A 91 5C ld A,(PFLAG) pro uchovani >PFLAG< F5 push AF FD 36 57 01 ld (PFLAG),1 >PFLAG< nastaven na OVER 1 3E 20 ld A,' '
0A47 0A4A 0A4B 0A4E 0A4F 0A4F 0A4F 0A4F 0A4F 0A4F 0A53 0A56 0A56 0A58 0A5B 0A5C 0A5F 0A5F 0A5F 0A5F 0A5F 0A62 0A63 0A64 0A65 0A67 0A69 0A69 0A6B 0A6D 0A6D 0A6D 0A6D 0A6D 0A6D 0A6D 0A6D 0A70 0A73 0A75 0A75 0A75 0A75 0A78 0A7A 0A7A 0A7D 0A80 0A80 0A83 0A84 0A85 0A86 0A87 0A87 0A8A 0A8D 0A90 0A91 0A92
CD 65 0B F1 32 91 5C C9
* *zpracovani "navratu vozu" (CR/ENTER) *pri pouziti tiskarny je vypsan buffer *pri vypisu na obrazovku nejdriv test,zda bude nutny SCROLL * FD CB 01 4E bit 1,(FLAGS) na tiskarnu ? C2 CD 0E jp NZ,#0ECD ano:skok na vypis bufferu * 0E 21 ld C,33 pozice sloupce na levy okraj CD 55 0C call #0C55 pripadne probehne SCROLL 05 dec B o jeden radek niz C3 D9 0D jp #0DD9 * *podpgm 'PRINT comma' *tzn. TAB 0 nebo TAB 16 * CD 03 0B call POSGET radek a sloupec do _BC 79 ld A,C 3D dec A o dva sloupce doprava 3D dec A E6 10 and 16 vytvori z cisla bud 0 nebo 16 18 5A jr TABFIL * 3E 3F PRTQUE ld A,'?' otaznik nahrazuje netisknutelny 18 6C jr PRTCHA znak * *zpracovani ridiciho znaku s operandy *pri 2 operandech (AT,TAB):vstup #0A75 *pri 1 operandu (INK..OVER):vstup #0A7A *ridici znak je vzdy ulozen do >TVDATA<,pri 2 operandech *je prvni zaznamenan do >TVDATA<+1 * 11 87 0A TWOOP ld DE,ONEOP 32 0F 5C ld (TVDATA+1),A ulozen prvni operand 18 0B jr OUTSET * *vstup pri 'AT' a 'TAB' * 11 6D 0A ld DE,TWOOP vypis upraven 18 03 jr #0A7D * 11 87 0A ld DE,ONEOP vypis upraven 32 0E 5C ld (TVDATA),A a ridici znak ulozen do >TVDATA< * 2A 51 5C OUTSET ld HL,(CURCHL) aktivni kanal pro vypis 73 ld (HL),E nyni nastaven 23 inc HL 72 ld (HL),D C9 ret * 11 F4 09 ONEOP ld DE,GIVOUT operandy preneseny a CD 80 0A call OUTSET vypis zase normalni 2A 0E 5C ld HL,(TVDATA) v _HL ridici znak a 1.operand 57 ld D,A 2.operand uschovan do _D 7D ld A,L test ridiciho znaku: FE 16 cp #16 'INK'..'OVER' ?
0A94 0A97 0A99 0A99 0A99 0A99 0A9A 0A9B 0A9D 0A9E 0AA0 0AA2 0AA3 0AA7 0AA9 0AA9 0AAB 0AAC 0AAF 0AAF 0AB0 0AB1 0AB2 0AB6 0AB9 0ABC 0ABF 0AC2 0AC2 0AC2 0AC2 0AC3 0AC6 0AC7 0AC8 0ACA 0ACB 0ACB 0ACC 0AD0 0AD2 0AD5 0AD6 0AD8 0AD9 0AD9 0AD9 0AD9 0ADC 0ADC 0ADC 0ADC 0ADC 0AE0 0AE2 0AE2 0AE6 0AE8 0AEC 0AEF
DA 11 22 20 29
jp jr
C,#2211 NZ,PRTTAB
44 4A 3E 91 38 C6 4F FD 20
1F 0C 02 CB 01 4E 16
3E 16 90 DA 9F 1E 3C 47 04 FD C2 FD DA C3
CB 55 BE 86 D9
02 46 0C 31 0C 0D
7C CD 03 0B 81 3D E6 1F C8 57 FD 3E CD 15 20 C9 CB 01 C6 20 3B 0C F8
CD 24 0B
FD CB 01 4E 20 1A FD 20 ED 22 C9 CB 02 46 08 43 88 5C 84 5C
* *zpracovani "AT" * ld B,H cislo radku (1.operand) ld C,D cislo sloupce ld A,31 pro posun zpet sub C odpovidajici prepocet jr C,#0AAC pokud prekroceny meze add 2 jinak +2,pote ld C,A _C v mezich 2..33 bit 1,(FLAGS) vypis na tiskarnu ? jr NZ,#0ABF ano:'LPRINT AT' * ld A,22 prepocet cisla radku sub B jp C,#1E9F chyba 'Integer out of range' * inc A pricteni 2 pro vyrovnani ld B,A inc B a prevedeni do _B bit 0,(TVFLAG) spodni cast obrazovky ? jp NZ,#0C55 ano:event.probehne SCROLL cp (DFSZ) v prostoru obrazovky ? jp C,#0C86 ne: 'Out of screen' jp #0DD9 ano:zpracovani druheho parametru * *zpracovani "TAB" * PRTTAB ld A,H prvni operand TABFIL call POSGET doda pozici add C pricteni poctu sloupcu dec A prepocet na pocet mezer (0..31) and #1F ktere budou vypsany ret Z pokud zadna mezera * ld D,A _D pouzito k odpocitavani set 0,(FLAGS) oddelovaci mezera potlacena PRTSPA ld A,' ' mezera call #0C3B vypsana dec D pocitadlo -1 jr NZ,PRTSPA jeste vypis dalsi mezery ret * *vypis "tisknutelnych" znaku,popr. tokens * PRTCHA call #0B24 * *nove cislo radku a sloupce jako adresa obrazoveho bodu *do systemove promenne * NEWSTO bit 1,(FLAGS) tiskarna ? jr NZ,#0AFC ano * bit 0,(TVFLAG) jde-li o spodni cast obrazovky jr NZ,#0AF0 skok ld (SPOSN),BC zapsani hodnot pro hlavni cast ld (DFCC),HL ret
0AF0 0AF4 0AF8 0AFB 0AFC 0AFC 0AFF 0B02 0B03 0B03 0B03 0B03 0B07 0B09 0B0D 0B10 0B14 0B15 0B19 0B1C 0B1D 0B20 0B23 0B24 0B24 0B24 0B24 0B26 0B28 0B2A 0B2C 0B2D 0B30 0B33 0B36 0B38 0B38 0B38 0B38 0B3B 0B3E 0B40 0B41 0B43 0B44 0B46 0B47 0B49 0B4A 0B4C 0B4D 0B4E 0B4F 0B51 0B52 0B52 0B52 0B52 0B54 0B56
ED 43 8A 5C ED 43 82 5C 22 86 5C C9 * FD 71 45 22 80 5C C9
ld (SPOSNL),BC zapsani hodnot pro spodni cast ld (ECHOE),BC ld (DFCCL),HL ret ld (PPOSN),C ld (PRCC),HL ret pri pouziti tiskarny se zapisi nove hodnoty
FD 20 ED 2A FD C8 ED 2A C9 FD 2A C9
CB 14 4B 84 CB
01 4E 88 5C 5C 02 46
4B 8A 5C 86 5C 4E 45 80 5C
FE 38 FE 30 47 CD CD 11 18
80 3D 90 26 38 0B 03 0B 92 5C 47
21 CD CB 9F E6 4F CB 9F E6 B1 0E 77 23 0D 20 C9
92 5C 3E 0B 18 0F 18 F0 04
FB
D6 A5 30 09 C6 15
* *PRINTova pozice na obrazovce/tiskarne do _BC a _HL * POSGET bit 1,(FLAGS) tiskarna ? jr NZ,#0B1D ano ld BC,(SPOSN) precteny parametry pro hlavni dil ld HL,(DFCC) obrazovky bit 0,(TVFLAG) ret Z navrat pri hlavni obrazovce ld BC,(SPOSNL) jinak precteny hodnoty spodniho dilu ld HL,(DFCCL) ret ld C,(PPOSN) precteni hodnot pro tiskarnu ld HL,(PRCC) ret * *vypsani znaku/tokens * cp #80 normalni znak (#20..#7F) ? jr C,#0B65 ano cp #90 jr NC,PRTOU pro UDG a tokens (>#8F) ld B,A zde jen semigrafika (#80..#8F) call #0B38 generovani grafickych znaku call POSGET prevzeti PRINTove pozice ld DE,MEMBOT jr #0B7F * *z bitu 0..3 generovan graficky znak * ld HL,MEMBOT adresa pro ulozeni vysledku vypoctu call #0B3E nasledujici rutina probehne 2krat rr B vyhodnocen bit0/(podruhe)bit2 sbc A pokud byl bit=1,je v _A #0F, and #0F jinak _A=#00 ld C,A mezivysledek do _C rr B vyhodnocen bit1/(podruhe)bit3 sbc A stejna operace,jako pred chvili and #F0 v _A #00 nebo #F0 or C spojeni s predchozim vysledkem ld C,4 vysledek je 4krat pouzit (_C pocita) ld (HL),A ulozeni do pameti inc HL posun ukazatele pro ukladani dec C pocitadlo -1 jr NZ,#0B4C neprobehlo 4krat:znovu ret ulozena prvni/druha ctverice bajtu * *zpracovani UDG a tokens * PRTOU sub #A5 jde o token ? jr NC,PRTTO ano:skok add #15 kod UDG je nyni #00..#0F
0B58 0B59 0B5D 0B5F 0B5F 0B62 0B65 0B65 0B65 0B65 0B66 0B6A 0B6B 0B6E 0B70 0B72 0B74 0B76 0B78 0B79 0B7A 0B7B 0B7C 0B7D 0B7E 0B7F 0B7F 0B7F 0B7F 0B80 0B81 0B83 0B85 0B86 0B87 0B8B 0B8D 0B8E 0B91 0B92 0B93 0B94 0B95 0B98 0B99 0B9A 0B9B 0B9E 0BA0 0BA1 0BA3 0BA4 0BA5 0BA6 0BA7 0BA8 0BAA 0BAB 0BAF 0BB1
C5 ED 4B 7B 5C 18 0B CD 10 0C C3 03 0B
C5 ED EB 21 CB FE 20 CB 26 6F 29 29 29 09 C1 EB
4B 36 5C 3B 5C 86 20 02 C6 00
79 3D 3E 20 05 4F FD 28 D5 CD D1 79 B9 D5 CC D1 C5 E5 3A 06 1F 38 04 1F 1F 9F 4F 3E A7 FD 28 FD
21 0E CB 01 4E 06 CD 0E
55 0C
91 5C FF 01
08 CB 01 4E 05 CB 30 CE
* PRTTO call PRTTOK token vypsan po znacich jp POSGET a dalsi vypis * *vypis normalnich znaku (ASCII) * push BC uschova pozice ld BC,(CHARS) adresa generatoru znaku ex DE,HL ld HL,FLAGS res 0,(HL) pozn:uvodni mezera akceptovana cp ' ' mezera ? jr NZ,PRTREA ne:skok set 0,(HL) pozn:mezera potlacena PRTREA ld H,0 vypocet jen pro "skutecne" znaky ld L,A k tomu:v _HL vytvorena adresa add HL,HL znaku v generatoru add HL,HL (krat 8,protoze znak je slozen add HL,HL z 8 bajtu) add HL,BC pripoctena bazova adresa generatoru pop BC pozice tisku obnovena v _BC ex DE,HL pocatecni adresa znaku do _DE * *zobrazeni vsech 8*8 bodu * ld A,C cislo sloupce dec A -1, tzn. o jedno misto doprava ld A,33 nastaveni na prvni sloupec jr NZ,#0B93 pokud tisk nebyl na konci:skok dec B jinak dalsi radek ld C,A a uplne levy sloupec bit 1,(FLAGS) tiskarna ? jr Z,#0B93 ne push DE uschova pocatecni adresy v gen. call #0ECD vypis bufferu tiskarny pop DE obnoveni pocatecni adresy ld A,C nove cislo sloupce cp C dalsi radek ? push DE uschova pocatecni adresy znaku call Z,#0C55 novy radek,popr. SCROLL pop DE obnoveni adresy znaku push BC uschova PRINT pozice push HL a adresy ve VIDEO ld A,(PFLAG) ld B,#FF rra testovan bit0 >PFLAG< jr C,#0BA4 inc B pro "OVER 1" je _B=#FF, jinak #00 rra testovan bit2 >PFLAG< rra sbc A ld C,A pro "INVERSE 1" je _C=#FF,jinak #00 ld A,8 _A nyni jako citac pixelu and A nulovani CARRY bit 1,(FLAGS) tiskarna ? jr Z,#0BB6 ne set 1,(FLAGS2) buffer neni prazdny
0BB5 0BB6 0BB7 0BB7 0BB7 0BB7 0BB8 0BB9 0BBA 0BBB 0BBC 0BBD 0BBE 0BC0 0BC1 0BC2 0BC3 0BC5 0BC5 0BC6 0BC7 0BCB 0BCE 0BCF 0BD0 0BD1 0BD2 0BD3 0BD3 0BD4 0BD6 0BD7 0BD8 0BD9 0BDB 0BDB 0BDB 0BDB 0BDC 0BDD 0BDE 0BDF 0BE1 0BE3 0BE4 0BE8 0BE9 0BEA 0BEB 0BEC 0BF0 0BF2 0BF4 0BF6 0BF8 0BFA 0BFE 0C00 0C02 0C04
37 EB
scf ex DE,HL * *znaky jsou * ex ld and xor xor ld ex jr inc inc dec jr * ex dec bit call pop pop dec inc ret * ex ld add ld ex jr * *podprogram * ld rrca rrca rrca and or ld ld ld xor and xor bit jr and bit jr xor bit jr and bit jr
vypisovany ve smycce (na 8krat) AF,AF' A,(DE) B (HL) C (DE),A AF,AF' C,#0BD3 D HL A NZ,#0BB7 DE,HL H 1,(FLAGS) Z,#0BDB HL BC C HL AF,AF' A,32 E E,A AF,AF' #0BC1 uschova CARRY a citace v _A pro respektovani "OVER" pro respektovani "INVERSE" vysledek ulozen obnoveni CARRY a pocitadla _A pri pouziti tiskarny cilova adresa +1 (stranka) bazova adresa +1 citac -1 jeste neprobehlo 8krat
08 1A A0 AE A9 12 08 38 13 14 23 3D 20 F2 EB 25 FD CB 01 4E CC DB 0B E1 C1 0D 23 C9 08 3E 20 83 5F 08 18 E6
bajt attributu jen na TV tiskarna:skok puvodni cilova adresa puvodni pozice o sloupec doprava cilova adresa +1 uschova CARRY = priznak tiskarny pro vyrovnani _F a citac _A zpet
pro definovani attributu A,H MSB cilove adresy delen 8 a tim stanovena odpovidajici cast obrazovky tim je vytvoren MSB adresy _D=ATTRT, _E=MASKT stary atribut precten a sloucen s >MASKT< a s >ATTRT< neskoci pri "PAPER 9" barva papiru na cernou test: tmavy INK ? ne ano:bily PAPER INK=9 ? ne INK nastaven na cernou pri bilem PAPER tak zustane
7C 0F 0F 0F E6 F6 67 ED 7E AB A2 AB FD 28 E6 CB 20 EE FD 28 E6 CB 20
03 58 5B 8F 5C
CB 57 76 08 C7 57 02 38 CB 57 66 08 F8 6F 02
3 #58 H,A DE,(ATTRT) A,(HL) E D E 6,(PFLAG) Z,#0BFA #C7 2,A NZ,#0BFA #38 4,(PFLAG) Z,#0C08 #F8 5,A NZ,#0C08
0C06 0C08 0C09 0C0A 0C0A 0C0A 0C0A 0C0A 0C0A 0C0B 0C0D 0C0E 0C10 0C10 0C13 0C14 0C17 0C19 0C1B 0C1F 0C22 0C22 0C22 0C22 0C23 0C25 0C28 0C29 0C2A 0C2B 0C2D 0C2D 0C2E 0C2E 0C30 0C32 0C34 0C35 0C35 0C36 0C38 0C39 0C3B 0C3B 0C3C 0C3D 0C3E 0C3F 0C40 0C41 0C41 0C41 0C41 0C42 0C43 0C44 0C46 0C47 0C49 0C4A
EE 07 77 C9
* *podprogram pro vypis hlaseni a tokens *_DE obsahuje bazovou adresu prislusne tabulky *_A obsahuje kod hlaseni nebo tokenu * E5 PRTREP push HL pro uchovani _HL 26 00 ld H,0 na zasobnik ulozi _L a _H=0 E3 ex (SP),HL pritom puvodni _HL zachova 18 04 jr #0C14 * 11 95 00 PRTTOK ld DE,#0095 adresa tabulky TOKENS F5 push AF uschova kodu CD 41 0C call #0C41 pocatek hledani v tabulce 38 09 jr C,#0C22 primo na vypis 3E 20 ld A,' ' pri CARRY=0 prip. vypise mezeru FD CB 01 46 bit 0,(FLAGS) CC 3B 0C call Z,#0C3B * *vypisuje hlaseni/TOKEN dokud nenarazi na bajt s bitem7=1 * 1A ld A,(DE) prevzeti znaku z tabulky E6 7F and #7F vynulovani bitu7 CD 3B 0C call #0C3B vypis znaku 1A ld A,(DE) jeste jednou prevezme znak 13 inc DE ukazatel do tabulky +1 87 add A pokud bit7=0, je CARRY=0, 30 F5 jr NC,#0C22 tedy vypis pokracuje * D1 pop DE _D=0 pro hlaseni _D=#00..#5A pro TOKEN FE 48 cp #48 pokud byl posledni znak '$', 28 03 jr Z,#0C35 preskoci FE 82 cp #82 pokud byl mensi nez #41 ('A'), D8 ret C navrat * 7A ld A,D pri hlasenich,'RND','INKEY$' FE 03 cp #03 a 'PI' navrat,jinak D8 ret C 3E 20 ld A,' ' vzdy vypise mezeru * D5 push DE uschova registru D9 exx D7 rst PRTOUT vypis znaku z _A D9 exx obnoveni registru D1 pop DE C9 ret * *zacatek hledani v tabulce hlaseni nebo tokens (podle _DE) * F5 push AF uschova kodu EB ex DE,HL _HL= pocatek tabulky 3C inc A kod +1 pro prohledavaci smycku CB 7E bit 7,(HL) testuje bit7 hodnot z tabulky 23 inc HL pokud je nulovy, 28 FB jr Z,#0C44 pak hledani konce hlaseni/tokenu 3D dec A odpocitava jednotliva hlaseni/tokens 20 F8 jr NZ,#0C44 _A=0:"hlaseni/token nalezeny"
0C4C 0C4D 0C4E 0C50 0C51 0C52 0C54 0C55 0C55 0C55 0C55 0C55 0C59 0C5A 0C5A 0C5D 0C5E 0C5F 0C63 0C66 0C66 0C69 0C6B 0C6C 0C6C 0C70 0C72 0C75 0C76 0C78 0C7A 0C7D 0C81 0C85 0C86 0C86 0C87 0C88 0C88 0C8B 0C8D 0C8F 0C90 0C93 0C96 0C97 0C9A 0C9B 0C9D 0CA0 0CA1 0CA4 0CA7 0CAB 0CAE 0CB0 0CB2 0CB3 0CB6 0CB7
EB F1 FE 20 D8 1A D6 41 C9
_DE ukazuje na zacatek hlaseni/TOKEN obnoveni jeho kodu v _A navrat pri kodu 0..31 jinak prevzeti prvniho znaku a test zda >#41 k pripadnemu vypisu mezery
FD CB 01 4E C0 11 D9 0D D5 78 FD CB 02 46 C2 02 0D FD BE 31 38 1B C0 FD 28 FD 1D 28 3E CD ED FD C9 CF 04 FD 20 3E 90 32 2A E5 3A F5 3E CD AF 11 CD FD 21 CB CB D9 CD D9 FE 35 52 45 18 8C 5C 8F 5C 91 5C FD 01 16 F8 0A CB 3B DE AE 0C 0C 02 EE 5C CB 02 66 16 5E 2D 5A 00 01 16 7B 3F 5C CB 02 A6
D4 15 20
* *podpgm pro test,zda je potrebny SCROLL *_B obsahuje testovane cislo radku * bit 1,(FLAGS) pokud je vypis na tiskarnu ret NZ primo navrat * ld DE,#0DD9 navratova adresa push DE na zasobnik ld A,B bit 0,(TVFLAG) pokud jde o 'INPUT AT' jp NZ,#0D02 pak skok (!! radky se pocitaji odspoda !!) cp (DFSZ) cislo radku vetsi nez >DFSZ< ? jr C,#0C86 ano:chyba ret NZ cislo radku mensi nez >DFSZ<:navrat dale tedy pokud rovno bit 4,(TVFLAG) automaticky listing ? jr Z,#0C88 ne ld E,(BREG) prevzeti pocitadla radku dec E a odecteni 1 jr Z,#0CD2 pokud 0: probehne SCROLL ld A,0 call OPCAN otevre kanal -Kld SP,(LISTSP) ulozeni navratove adresy res 4,(TVFLAG) pozn:automaticky listing ukoncen ret * rst ERROUT chybove hlaseni DEFB #04 'Out of screen' * dec (SCRCT) pocitadlo scroll -1 jr NZ,#0CD2 pokud nenulove: primo SCROLL ld A,24 jinak dotaz 'scroll ?' sub B nova hodnota citace scroll ld (SCRCT),A zapsana ld HL,(ATTRT) ulozeni hodnot >ATTRT< a >MASKT< push HL ld A,(PFLAG) taktez >PFLAG< push AF ld A,#FD call OPCAN otevreni kanalu -Kxor A _A=0 (prvni hlaseni) ld DE,SCROLL do _DE adresa tabulky call #0C0A vypis 'scroll ?' set 5,(TVFLAG) pozn:"smazat spodni dil po stisku" ld HL,FLAGS set 3,(HL) nastaven mod =L= res 5,(HL) pozn:"dosud zadna klavesa" exx call #15D4 prevezme jeden znak z klavesnice exx cp #20 pokud stisknuto 'BREAK','STOP','N',
0CB9 0CBB 0CBD 0CBF 0CC1 0CC3 0CC5 0CC7 0CCA 0CCB 0CCE 0CCF 0CD2 0CD2 0CD2 0CD2 0CD5 0CD8 0CD9 0CDB 0CDC 0CDF 0CE0 0CE1 0CE2 0CE3 0CE5 0CE7 0CE8 0CEB 0CEB 0CEC 0CED 0CEF 0CF0 0CF1 0CF2 0CF3 0CF4 0CF6 0CF7 0CF8 0CF8 0CF8 0CF8 0D00 0D00 0D01 0D02 0D02 0D02 0D02 0D04 0D06 0D09 0D0B 0D0C 0D0E 0D0F 0D10
28 FE 28 F6 FE 28 3E CD F1 32 E1 22
45 E2 41 20 6E 3B FE 01 16 91 5C 8F 5C
Z,#0D00 #E2 Z,#0D00 #20 #6E Z,#0D00 A,#FE OPCAN AF (PFLAG),A HL (ATTRT),HL
* *rolovani obrazovky a nove nastaveni parametru * CD FE 0D call #0DFE rolovani cele obrazovky FD 46 31 ld B,(DFSZ) nove cislo radku horniho dilu 04 inc B 0E 21 ld C,#21 nastaveni prvniho sloupce C5 push BC uschova CD 9B 0E call #0E9B vyhledani odpovidajiciho atributu 7C ld A,H 0F rrca 0F rrca 0F rrca E6 03 and 3 F6 58 or #58 67 ld H,A vysledek do _HL 11 E0 5A ld DE,#5AE0 ukazuje na prvni atribut nejspodnejsiho radku 1A ld A,(DE) precteni hodnoty tam ulozene 4E ld C,(HL) 06 20 ld B,32 citac pro 32 znaku na radku EB ex DE,HL 12 ld (DE),A vymenen prvni atribut 71 ld (HL),C 13 inc DE a stejne hodnoty 23 inc HL prideleny nasledujicim 32 bajtum 10 FA djnz #0CF0 C1 pop BC cislo radku & sloupce C9 ret nejnizsiho radku obnoveno * *dotaz 'scroll ?' * 80 73 63 72 SCROLL DEFB #80 'scroll ' #BF * CF rst ERROUT hlaseni: 0C DEFB #0C 'BREAK - CONT repeats' * *zpracovani spodni casti obrazovky * FE 02 cp 2 pokud spodni cast prilis velka 38 80 jr C,#0C86 hlaseni 'Out of screen' FD 86 31 add (DFSZ) D6 19 sub #19 navrat, kdyz D0 ret NC neni scrolling potrebny ED 44 neg v _A pocet SCROLL C5 push BC uschova cisla radku & sloupce 47 ld B,A pro uschovu poctu SCROLL 2A 8F 5C ld HL,(ATTRT) >ATTRT<, >MASKT<
0D13 0D14 0D17 0D18 0D1B 0D1C 0D1D 0D20 0D21 0D22 0D23 0D24 0D27 0D28 0D2A 0D2B 0D2D 0D30 0D31 0D32 0D34 0D35 0D38 0D39 0D3C 0D40 0D44 0D47 0D4B 0D4C 0D4D 0D4D 0D4D 0D4D 0D4D 0D4E 0D51 0D55 0D57 0D58 0D5B 0D5E 0D5E 0D61 0D63 0D63 0D64 0D65 0D66 0D68 0D69 0D6A 0D6B 0D6B 0D6B 0D6B 0D6E 0D71 0D73 0D75
E5 2A E5 CD 78 F5 21 46 78 3C 77 21 BE 38 34 06 CD F1 3D 20 E1 FD E1 22 ED FD CD FD C1 C9
91 5C 4D 0D 6B 5C
89 5C 03 18 00 0E E8 75 57 8F 4B CB D9 CB 5C 88 5C 02 86 0D 02 C6
push ld push call ld push ld ld ld inc ld ld cp jr inc ld call pop dec jr pop ld pop ld ld res call set pop ret
HL HL,(PFLAG) HL ACTCOL A,B AF HL,DFSZ B,(HL) A,B A (HL),A HL,SPOSN+1 (HL) C,#0D2D (HL) B,24 #0E00 AF A NZ,#0D1C HL (PFLAG),L HL (ATTRT),HL BC,(SPOSN) 0,(TVFLAG) #0DD9 0,(TVFLAG) BC
a >PFLAG< ulozeny pocet SCROLL zpet do _A a uschovan hodnota z >DFSZ< zvetsena o 1 a zapsana zpet pokud musi scrollovat jen spodni dil:skok jinak MSB SPOSN +1 a SCROLL cele obrazovky rolovani _B radku obnovi citac SCROLL a odecita je hotovo zapise puvodni hodnoty take do >ATTRT< a >MASKT< jestlize bylo zmeneno >SPOSN< spocita nove >DFCC< pozn: znovu spodni dil obnoveno cislo radku & sloupce
* *tento podpgm zapise aktualni barvy *do transparentnich promennych >ATTRT< a >MASKT< * AF ACTCOL xor A _A=0 2A 8D 5C ld HL,(ATTRP) aktualni >ATTRP< a >MASKP< FD CB 02 46 bit 0,(TVFLAG) ktery dil obrazovky ? 28 04 jr Z,#0D5B horni:skok 67 ld H,A spodni: _A FD 6E 0E ld L,(BORDCR) a >BORDCR< pouzity pro 22 8F 5C ld (ATTRT),HL >ATTRT< a >MASKT< *nove nastaveni >PFLAG< (pro spodni dil je _A=0) 21 91 5C ld HL,PFLAG 20 02 jr NZ,#0D65 pri spodni casti vzdy skok * 7E ld A,(HL) horni dil:precteni stare hodnoty 0F rrca a liche bity (7,5,3,1) AE xor (HL) okopirovany do sudych E6 55 and #55 pro spodni cast budou AE xor (HL) smazany pouze sude bity 77 ld (HL),A C9 ret * *prikaz CLS * CD AF 0D call #0DAF smazani cele obrazovky 21 3C 5C ld HL,TVFLAG spodni dil po stisku klavesy CB AE res 5,(HL) nesmazan CB C6 set 0,(HL) pozn: "spodni dil" CD 4D 0D call ACTCOL >BORDCR< okopirovan do >ATTRT<
0D78 0D7B 0D7E 0D81 0D84 0D85 0D87 0D89 0D8A 0D8B 0D8C 0D8E 0D90 0D90 0D94 0D96 0D99 0D9C 0D9F 0DA0 0DA1 0DA2 0DA3 0DA4 0DA7 0DA8 0DAA 0DAD 0DAF 0DAF 0DAF 0DAF 0DB2 0DB5 0DB9 0DBC 0DBE 0DC1 0DC4 0DC6 0DC9 0DCC 0DCF 0DD0 0DD1 0DD2 0DD6 0DD9 0DD9 0DD9 0DD9 0DD9 0DD9 0DDC 0DE0 0DE2 0DE3 0DE7 0DE9 0DEC
FD CD 21 3A 05 18 0E 2B 77 0D 20 10 FD 3E CD 2A 11 A7 73 23 72 23 11 3F 38 01 18
46 44 C0 8D 07 20
31 0E 5A 5C
FB F7 * 36 FD 01 51 F4 31 02 16 5C 09
ld call ld ld dec jr ld dec ld dec jr djnz ld ld call ld ld and ld inc ld inc ld ccf jr ld jr
B,(DFSZ) #0E44 HL,#5AC0 A,(ATTRP) B #0D8E C,32 HL (HL),A C NZ,#0D89 #0D87 (DFSZ),2 A,#FD OPCAN HL,(CURCHL) DE,GIVOUT A (HL),E HL (HL),D HL DE,#10A8 C,#0DA0 BC,#1721 #0DD9
precteni >DFSZ< a smazani spodniho dilu adresa atributu z radku 22 >ATTRP< bude pouzito pro spodni dil jako atribut pocet znaku v radku hodnota ulozena do oblasti ATTR radek jeste neni hotov spodni dil jeste neni hotov spodni dil nastaven na 2 radky kanal -Kotevren adresa aktualniho kanalu adresa rutiny pro vypis (CARRY smazano) zapsana (pripadne nadvakrat) adresa rutiny pro vstup klavesy (pro mozny dvojnasobny prubeh) cislo radku & sloupce prvniho spodniho radku
A8 10 F6 21 17 2A
21 22 FD CD 3E CD CD 06 CD 2A 11 73 23 72 FD 01
00 7D CB 94 FE 01 4D 18 44 51 F4
00 5C 30 86 0D 16 0D 0E 5C 09
36 52 01 21 18
21 FD 20 78 FD 28 FD D6
00 5B CB 01 4E 12 CB 02 46 05 86 31 18
* *smazani obrazovky * ld HL,#0000 vynulovani souradnic tisku ld (COORDS),HL res 0,(FLAGS2) pozn: "obrazovka smazana" call #0D94 nastaveni -K- a orig.adres rutin ld A,#FE kanal -Scall OPCAN otevren call ACTCOL pouzity permanent.hodnoty barev ld B,24 pocet radku obrazovky call #0E44 smazan ld HL,(CURCHL) adresa akt. kanalu ld DE,GIVOUT adresa rutiny pro vypis ld (HL),E zapsana inc HL pro tento kanal ld (HL),D ld (SCRCT),1 pocitadlo SCROLL pro dalsi pouziti ld BC,#1821 prvni radek a prvni sloupec * *stanoveni pozice PRINT na obrazovce *opusteni rutiny s cislem radku & sloupce v _BC *nebo pro tiskarnu s cislem sloupce v _C * ld HL,PRTBUF adresa bufferu tiskarny bit 1,(FLAGS) ma byt pouzita tiskarna ? jr NZ,#0DF4 ano ld A,B prevzeti cisla radku bit 0,(TVFLAG) ktery dil obrazovky ? jr Z,#0DEE hlavni:skok add (DFSZ) cislo radku + DFSZ -24 sub 24 protoze se pocita zespodu
0DEE 0DEF 0DF0 0DF3 0DF4 0DF6 0DF7 0DF8 0DFA 0DFB 0DFE 0DFE 0DFE 0DFE 0DFE 0E00 0E03 0E05 0E06 0E07 0E08 0E0A 0E0B 0E0D 0E0D 0E0D 0E0E 0E11 0E12 0E13 0E16 0E17 0E19 0E19 0E19 0E19 0E1A 0E1D 0E1E 0E1F 0E20 0E22 0E23 0E24 0E25 0E26 0E27 0E29 0E2B 0E2D 0E2E 0E30 0E32 0E32 0E32 0E32 0E32 0E33 0E34 0E35
C5 47 CD C1 3E 91 5F 16 19 C3
9B 0E 21 00 DC 0A
uschova pozice kopie do _B pro vypocet adresy ve VIDEO obnoveni pozice prepocet cisla sloupce,protoze se pocita zprava vytvoreni nove adresy a jeji ulozeni spolu s cislem radku & sloupce
06 CD 0E C5 E5 78 E6 78 20
17 9B 0E 08
07 0C
EB 21 E0 F8 19 EB 01 20 00 3D ED B0
EB 21 19 EB 47 E6 0F 0F 0F 4F 78 06 ED 06 09 E6 20
E0 FF
07
00 B0 07 F8 DB
E1 24 C1 0D
* *podpgm pro provedeni SCROLL *pocet radku pripraven v _BC * ld B,23 vstupni bod po dotazu 'scroll?' call #0E9B vyhledani pocatecni adresy radku ld C,8 8 pixelu na radek push BC uschovani citace radku & pixelu push HL a rovnez pocatecni adresy ld A,B zjisti,zda bude scrollovan and 7 horni radek obrazove tretiny ld A,B jr NZ,#0E19 ne ano:horni radek musi byt zkopirovan do spodniho ve vyssi tretine ex DE,HL uschova _HL ld HL,#F8E0 hodnota pro vypocet druhe adresy add HL,DE pro okopirovani ex DE,HL ld BC,32 prenos 32 znaku dec A (citac -1) ldir okopirovani radku * *scroling pixel-radku v ramci tretiny obrazovky * ex DE,HL spocitani cilove adresy pro _DE ld HL,#FFE0 o 32 bajtu zpet add HL,DE ex DE,HL ld B,A uschova cisla radku and 7 pocet znaku rrca ktere budou presouvany rrca v ramci teto tretiny obrazovky rrca ld C,A predan do _C ld A,B cislo radku zpet do _A ld B,0 _BC = pocet presouvanych znaku v /3 ldir provedeni presunu ld B,7 add HL,BC _HL + #0700 pro dalsi tretinu and #F8 pokud ma byt zpracovana dalsi jr NZ,#0E0D tretina:skok * *vyse uvedena rutina musi probehnout 8 krat *zvlast pro kazdy pixel-radek * pop HL startovni adresa obnovena inc H +1 pro dalsi pixel-radek pop BC obnoveni citace pixelu dec C a jeho snizeni
0E36 0E38 0E38 0E38 0E38 0E3B 0E3E 0E3F 0E40 0E42 0E44 0E44 0E44 0E44 0E45 0E48 0E4A 0E4B 0E4C 0E4D 0E4F 0E50 0E51 0E52 0E53 0E54 0E56 0E57 0E58 0E59 0E5B 0E5C 0E5E 0E61 0E62 0E63 0E65 0E66 0E68 0E68 0E68 0E68 0E69 0E6A 0E6B 0E6C 0E6E 0E71 0E72 0E73 0E74 0E77 0E7B 0E7D 0E80 0E81 0E82 0E84 0E85 0E87
20 CD
jr NZ,#0E05 jeste neprobehlo 8 krat * *atributy musi take scrollovat * CD 88 0E call #0E88 vypocet adresy atributu 21 E0 FF ld HL,#FFE0 rozdil o 32 19 add HL,DE odecten od _DE EB ex DE,HL ED B0 ldir presun 06 01 ld B,1 nejnizsi radek bude smazan * *tato rutina smaze _B radku odspodu * C5 push BC uschova pozice CD 9B 0E call #0E9B vypocet adresy do _HL 0E 08 ld C,8 8 pixel-radku C5 push BC cislo radku,citac pixel a E5 push HL startovni adresa ulozeny 78 ld A,B cislo radku do _A E6 07 and 7 0F rrca prepocitano 0F rrca 0F rrca 4F ld C,A a zapsano do _C 78 ld A,B 06 00 ld B,0 0D dec C _BC = pocet znaku -1 54 ld D,H startovni adresa do _DE 5D ld E,L 36 00 ld (HL),0 smazani jednoho pixelu 13 inc DE pro smycku _DE +1 ED B0 ldir smazani vsech dalsich pixelu 11 01 07 ld DE,#0701 pro pixel-radek v dalsi tretine 19 add HL,DE pricteno #0701 3D dec A cislo radku -1 E6 F8 and #F8 pouze "tretinove" pocitadlo 47 ld B,A predano do _B 20 E5 jr NZ,#0E4D a prip. zpracovani dalsi tretiny * *kontrola,zda rutina probehla 8 krat * E1 pop HL obnoveni startovni adresy 24 inc H posunuti o pixel-radek C1 pop BC obnoveni citace radku & pixelu 0D dec C pixel -1 20 DC jr NZ,#0E4A jeste neprobehlo 8 krat pro radek CD 88 0E call #0E88 adresa a pocet atributu 62 ld H,D 6B ld L,E 13 inc DE 3A 8D 5C ld A,(ATTRP) permanent.barvy pro horni dil FD CB 02 46 bit 0,(TVFLAG) horni dil obrazovky ? 28 03 jr Z,#0E80 ano 3A 48 5C ld A,(BORDCR) jinak pouzita barva BORDER 77 ld (HL),A prvni atribut zapsan 0B dec BC citac -1 ED B0 ldir zapsany vsechny ostatni C1 pop BC obnoveni cisla radku 0E 21 ld C,33 cislo sloupce na krajni levy C9 ret
0E88 0E88 0E88 0E88 0E89 0E8A 0E8B 0E8C 0E8D 0E8F 0E90 0E91 0E92 0E93 0E94 0E95 0E96 0E97 0E98 0E99 0E9A 0E9B 0E9B 0E9B 0E9B 0E9D 0E9E 0E9F 0EA0 0EA1 0EA2 0EA4 0EA5 0EA6 1EA8 0EAA 0EAB 0EAC 0EAC 0EAC 0EAC 0EAD 0EAF 0EB2 0EB3 0EB4 0EB7 0EB8 0EB9 0EBA 0EBB 0EBD 0EBF 0EC0 0EC2 0EC3 0EC4 0EC5 0EC7 0EC8
7C 0F 0F 0F 3D F6 50 67 EB 61 68 29 29 29 29 29 44 4D C9
3E 90 57 0F 0F 0F E6 6F 7A E6 F6 67 C9
18
E0 18 40
F3 06 21 E5 C5 CD C1 E1 24 7C E6 20 7D C6 6F 3F 9F E6 84 67
B0 00 40 F4 0E
07 0A 20
F8
* *vypocet adresy atributu prislusneho k pixelu * ld A,H prevzeti MSB adresy pixelu rrca krat 32 rrca rrca dec A -1 or #50 bazova adresa oblasti atributu ld H,A spocitan MSB, zpet do _HL ex DE,HL LSB zustava nezmenen ld H,C _C je vzdy nulovy ld L,B cislo radku add HL,HL rovnez vynasobeno 32 add HL,HL add HL,HL add HL,HL add HL,HL ld B,H a vraceno do _BC ld C,L ret * *tvorba adresy pixelu v _HL * ld A,24 sub B radky jsou pocitany zespodu ld D,A mezivysledek do _D rrca vynasoben 32 rrca (3x rotace doprava = 5x doleva) rrca and #E0 ponecha 3 platne bity ld L,A spocitan LSB ld A,D mezivysledek zpet and #18 MSB muze byt jen #40/#48/#50 or #40 ld H,A spocitan MSB ret * *COPY screen * di ld B,#B0 176 radku pro tisk jednou jehlou ld HL,VIDEO pocatecni adresa VIDEO NXLINE push HL push BC call PRLINE vypsani radku jedne jehly pop BC pop HL inc H o 256 vyse je dalsi pixel-radek ld A,H and 7 jr NZ,NXLIN1 jeste v ramci znakoveho radku ld A,L add 32 o 32 vyse je dalsi znakovy radek ld L,A ccf pretekl _L ? sbc A ano:#FF,jinak #00 and #F8 bit0..bit3 pocita radky jehly add H pripocte se #F8,pokud _L=#00 ld H,A
0EC9 0ECB 0ECD 0ECD 0ECD 0ECD 0ECE 0ED1 0ED3 0ED4 0ED7 0ED8 0EDA 0EDC 0EDE 0EDF 0EDF 0EE2 0EE5 0EE5 0EE6 0EE7 0EE8 0EE9 0EEB 0EEB 0EEF 0EF1 0EF4 0EF4 0EF4 0EF4 0EF5 0EF7 0EF8 0EFA 0EFC 0EFD 0EFD 0F00 0F02 0F04 0F06 0F07 0F0A 0F0B 0F0C 0F0C 0F0E 0F0F 0F10 0F12 0F12 0F12 0F12 0F14 0F15 0F16 0F18 0F1A
10 E7 18 0D
NXLIN1 djnz NXLINE smycka pro 176 radku jr #0EDA konec COPY * *vypis bufferu tiskarny (#5B00..#5BFF) * F3 di 21 00 5B ld HL,PRTBUF pocatecni adresa bufferu 06 08 ld B,8 vypis do 8 jehlovych radku C5 push BC CD F4 0E call PRLINE vypis jednoho radku (32 bajtu) C1 pop BC 10 F9 djnz #0ED3 3E 04 ld A,4 nastavenym bitem 3 se odpoji tisk D3 FB out (#FB),A FB ei * 21 00 5B ld HL,PRTBUF pocatecni adresa FD 75 46 ld (PRCC),L nulove >PRCC< *vymazani celeho bufferu AF xor A _A=0 47 ld B,A _B=0 pro 256 cyklu 77 CLRPRB ld (HL),A ulozeni nuly 23 inc HL posun ukazovatka v bufferu 10 FC djnz CLRPRB konec cyklu * FD CB 30 8E res 1,(FLAGS2) pozn:"buffer prazdny" 0E 21 ld C,33 levy sloupec C3 D9 0D jp #0DD9 * *vypis jehloveho radku (32 bajtu grafiky) * 78 PRLINE ld A,B pocet jehlovych radku k tisku FE 03 cp 3 9F sbc A E6 02 and 2 pokud uz jen dva radky, D3 FB out (#FB),A brzden motor tiskarny 57 ld D,A * CD 54 1F call #1F54 test klavesy 'BREAK' 38 0A jr C,#0F0C nestisknuta 3E 04 ld A,4 vypinaci bit tiskarny =1 D3 FB out (#FB),A aktivovan FB ei CD DF 0E call #0EDF vynulovani bufferu CF rst ERROUT hlaseni: 0C DEFB #0C 'BREAK - CONT repeats' * DB FB in A,(#FB) precteni stavu tiskarny 87 add A bit6 musi byt nulovy,jinak F8 ret M neni tiskarna pripojena 30 EB jr NC,#0EFD pokud bit7=0,ceka ve smycce * *vsechno pripraveno k tisku * 0E 20 ld C,32 vypis 32 bajtu 5E PRTBYT ld E,(HL) prevezme bajt urceny k vypisu 23 inc HL posun ukazovatka v bufferu 06 08 ld B,8 kazdy bajt=8 bitu CB 12 PRTBIT rl D bit7 na portu #FB ovlada jehlu CB 13 rl E _E rotuje kvuli prisunu bitu
0F1C 0F1E 0F1E 0F20 0F21 0F23 0F23 0F24 0F26 0F28 0F29 0F2B 0F2C 0F2C 0F2C 0F2C 0F2C 0F2C 0F2C 0F2F 0F30 0F33 0F34 0F38 0F3B 0F3C 0F3E 0F41 0F44 0F47 0F48 0F4B 0F4C 0F4E 0F50 0F52 0F54 0F56 0F58 0F58 0F58 0F58 0F5B 0F5C 0F5E 0F60 0F60 0F61 0F65 0F68 0F68 0F6B 0F6C 0F6C 0F6F 0F70 0F73 0F77 0F7A 0F7B
CB 1A * DB FB 1F 30 FB * 7A D3 FB 10 F0 0D 20 E9 C9
rr
_D obsahuje prikaz k tisku bit0 hlasi pripravenost tiskarny smycka dokud nebude "READY"
ld A,D out (#FB),A aktivuje jehlu djnz PRTBIT dalsi bit z _E dec C dalsi bajt z jehloveho radku jr NZ,PRTBYT ret *============================================================ * *EDITACE RADKU *volani hlavni rutinou pro editovani radku *nebo prikazem INPUT * 2A 3D 5C ld HL,(ERRSP) uschova ukazatele na chybovy E5 push HL zasobnik 21 7F 10 ld HL,#107F navratova adresa pri nalezeni chyby E5 push HL editorem take na zasobnik ED 73 3D 5C ld (ERRSP),SP ukazatel na ni do >ERRSP< CD D4 15 call WAITA prevzeti F5 push AF a ulozeni znaku z klavesnice 16 00 ld D,0 FD 5E FF ld E,(PIP) delka pipnuti klavesnice 21 C8 00 ld HL,#00C8 vyska tonu CD B5 03 call BEEP a ozve se odpovidajici pipnuti F1 pop AF obnoven znak z klavesnice 21 38 0F ld HL,#0F38 navratova adresa E5 push HL pro vecnou smycku FE 18 cp #18 pro vsechny znaky,tokens a grafiku 30 31 jr NC,#0F81 skok FE 07 cp 7 taktez PRINT comma 38 2D jr C,#0F81 FE 10 cp #10 editacni kody (DEL.,cursor...) 38 3A jr C,#0F92 * *ridici kody 'INK' .. 'TAB' * 01 02 00 ld BC,#0002 2 mista pri 'INK' a 'PAPER' 57 ld D,A kopie stisknuteho znaku FE 16 cp #16 "INK" nebo "PAPER" ? 38 0C jr C,#0F6C ano * 03 inc BC 3 mista pro 'AT' a 'TAB' FD CB 37 7E bit 7,(FLAGX) 'INPUT LINE' ? CA 1E 10 jp Z,#101E ne:skok * CD D4 15 call WAITA prevezme dalsi znak a 5F ld E,A ulozi do _E * CD D4 15 call WAITA dalsi znak pro ridici kod D5 push DE 2A 5B 5C ld HL,(KCUR) FD CB 07 86 res 0,(MODE) nastaveni modu =K= CD 55 16 call MAKESP vyhradi 2 nebo 3 mista (dle _BC) C1 pop BC obnoveni ridiciho kodu 23 inc HL a jeho ulozeni na vyhrazene misto
0F7C 0F7D 0F7E 0F7F 0F81 0F81 0F81 0F81 0F85 0F88 0F8B 0F8C 0F8D 0F91 0F92 0F92 0F92 0F92 0F93 0F95 0F98 0F99 0F9A 0F9B 0F9C 0F9F 0FA0 0FA0 0FA0 0FA0 0FA1 0FA2 0FA3 0FA4 0FA5 0FA6 0FA7 0FA8 0FA9 0FA9 0FA9 0FA9 0FAC 0FB0 0FB3 0FB6 0FB9 0FBA 0FBB 0FBE 0FBF 0FC0 0FC1 0FC2 0FC3 0FC6 0FC7 0FC8 0FC9 0FCC
70 23 71 18 0A
ld inc ld jr
* *tato rutina pripoji znak k input/editovanemu radku * FD CB 07 86 res 0,(MODE) nastaveni modu =K= 2A 5B 5C ld HL,(KCUR) pozice kurzoru CD 52 16 call ONEONL vyhradi jedno misto 12 ld (DE),A zaslani znaku/kodu 13 inc DE pozice kurzoru +1 a ED 53 5B 5C ld (KCUR),DE zapsana C9 ret normalne ve smycce (na #0F38) * *zpracovani ridiciho znaku editoru * 5F ld E,A kod do _DE 16 00 ld D,0 21 99 0F ld HL,#0F99 bazova adresa tabulky 19 add HL,DE absolutni adresa v tabulce 5E ld E,(HL) ofset do _E 19 add HL,DE spocitana adresa prislusne E5 push HL obsluzne rutiny a ulozena 2A 5B 5C ld HL,(KCUR) precteni adresy kurzoru C9 ret a skok na vykonnou rutinu * *vyrovnavaci tabulka pro ridici znaky editoru * 09 DEFB #09 EDIT 66 DEFB #66 kurzor vlevo 6A DEFB #6A kurzor vpravo 50 DEFB #50 kurzor dolu B5 DEFB #B5 kurzor nahoru 70 DEFB #70 DELETE 7E DEFB #7E ENTER CF DEFB #CF SYMBOL shift D4 DEFB #D4 graphics * *rutina pro EDIT (pri stlaceni 'EDIT') * 2A 49 5C ld HL,(EPPC) nacteni cisla bezneho radku pgmu FD CB 37 6E bit 5,(FLAGX) v inputovem modu ? C2 97 10 jp NZ,#1097 ano:skok (smazani vkladaneho udaje) CD 6E 19 call #196E vyhledani pocatecni adresy radku CD 95 16 call RLOOK a k tomu cislo radku 7A ld A,D B3 or E cislo radku =0 ? CA 97 10 jp Z,#1097 pouze smazani editacni zony E5 push HL uschova adresy radku 23 inc HL precteni delky radku 4E ld C,(HL) 23 inc HL nyni bude _DE=cislo,_BC=delka radku 46 ld B,(HL) 21 0A 00 ld HL,10 k delce radku pricteno 10 ke 09 add HL,BC zjisteni,zda je jeste dostatecne 44 ld B,H misto ke zpracovani 4D ld C,L v _BC puvodni delka +10 CD 05 1F call #1F05 test,zda pamet postacuje CD 97 10 call #1097 smazani editacni zony
0FCF 0FD2 0FD3 0FD4 0FD6 0FD9 0FDA 0FDB 0FDE 0FE1 0FE4 0FE7 0FE8 0FE9 0FEA 0FEB 0FEE 0FEF 0FF2 0FF3 0FF3 0FF3 0FF3 0FF7 0FF9 0FFC 0FFF 1001 1005 1007 1007 1007 1007 100A 100C 100C 100C 100C 100D 100F 1010 1011 1014 1015 1015 1015 1015 1018 101B 101E 101E 1021 1024 1024 1025 1026 1027 102A 102E 102F
2A E3 E5 3E CD E1 2B FD CD FD 2A 23 23 23 23 22 E1 CD C9
51 5C FF 01 16 35 55 34 59 0F 18 0F 5C
5B 5C 15 16
ld ex push ld call pop dec dec call inc ld inc inc inc inc ld pop call ret
HL,(CURCHL) (SP),HL HL A,#FF OPCAN HL HL (EPPC) #1855 (EPPC) HL,(ELINE) HL HL HL HL (KCUR),HL HL #1615
aktualni adresa kanalu ulozena,adresa radku obnovena v_HL a jeste uschovana otevreni kanalu -R-,ke kopirovani radku do editacni zony pocatecni adresa radku -1 cislo radku -1,aby nebyl psan kurzor preneseni BASIC radku puvodni cislo radku pocatek radku v prac.oblasti preskoceni cisla a delky
zapsana nova adresa kurzoru puvodni kanalova adresa zapsana do >FLAGS< navrat do smycky editoru
* *rutina "kurzor dolu" * FD CB 37 6E bit 5,(FLAGX) inputovy mod ? 20 08 jr NZ,#1001 ano 21 49 5C ld HL,EPPC adresa bezneho radku (s kurzorem) CD 0F 19 call #190F vyhledani cisla radku 18 6D jr #106E a vylistovani FD 36 00 10 ld (ERRNR),16 'STOP in INPUT' 18 1D jr #1024 * *kurzor doleva (o jedno misto) * CD 31 10 call #1031 provedeni presunu 18 05 jr SETKCU a zapsani nove pozice do >KCUR< * *kurzor doprava (o jednu) * 7E ld A,(HL) aktualni znak FE 0D cp 13 testovan na 'ENTER' C8 ret Z ano:navrat 23 inc HL jinak posun >KCUR< 22 5B 5C SETKCU ld (KCUR),HL na dalsi znak C9 ret navrat do smycky editoru * *DELETE (mazani znaku) * CD 31 10 call #1031 kurzor doleva 01 01 00 ld BC,1 a jeden znak C3 E8 19 jp OUT2 smazan * CD D4 15 call WAITA smazani 2 znaku CD D4 15 call WAITA * E1 pop HL smazano:navratova adresa do editoru E1 pop HL a chybova E1 pop HL obnoveni stare hodnoty >ERRSP< 22 3D 5C ld (ERRSP),HL FD CB 00 7E bit 7,(ERRNR) navrat,pokud se nevyskytla chyba C0 ret NZ syntaxe F9 ld SP,HL jinak skok na chybovou rutinu
1030 1031 1031 1031 1031 1032 1035 1035 1037 1038 1039 103A 103B 103C 103D 103E 103E 103F 1040 1041 1042 1044 1046 1048 1049 104A 104C 104E 1050 1051 1052 1054 1055 1056 1058 1059 1059 1059 1059 105D 105E 105E 1061 1064 1065 1068 106B 106E 1071 1073 1076 1076 107A 107C 107F 107F 107F 107F 1083 1085
C9
37 CD 95 11 ED 52 19 23 C1 D8 C5 44 4D 62 6B 23 1A E6 FE 20 23 1A D6 CE 20 23 A7 ED 09 EB 38 C9
F0 10 09 17 00 01 42 E6
FD CB 37 6E C0 2A CD EB CD 21 CD CD 3E C3 49 5C 6E 19 95 4A 1C 95 00 01 16 5C 19 17 16
FD CB 37 7E 28 A8 C3 81 0F
FD CB 30 66 28 A1 FD 36 00 FF
ret * *kurzor doleva,nejvice po zacatek radku * scf CARRY nastaveno call EDDE do _DE >ELINE< (pri editaci) nebo >WORKSP< (pri INPUT) sbc HL,DE CARRY zustane nastaveno,pokud add HL,DE je kurzor na zacatku radku inc HL pop BC (odstraneni navratove adresy) ret C v tom pripade zpet do smycky editoru push BC (vraceni navratove adresy) ld B,H adresa kurzoru do _BC ld C,L * ld H,D adresa znaku do _HL ld L,E inc HL +1 ld A,(DE) precteni znaku and #F0 _A > #0F a zaroven cp #10 _A < #20 ? jr NZ,#1051 ne inc HL pro parametr +1 ld A,(DE) znovu precteni znaku sub #17 adc 0 #16 a #17 zmeni na #00 jr NZ,#1051 nejde o #16..#17 inc HL and A smazani CARRY sbc HL,BC add HL,BC _HL jako predtim ex DE,HL jr C,103E ret * *kurzor nahoru (o jednu) * bit 5,(FLAGX) mod INPUT ? ret NZ ano * ld HL,(EPPC) aktualni cislo radku a call #196E pocatecni adresa ex DE,HL _HL nastaveno na radek pred call RLOOK a vyhledano jeho cislo ld HL,EPPC+1 call #191C cislo radku ulozeno a call LISTOU vylistovan pgm ld A,0 prepnuti na kanal -Kjp OPCAN * bit 5,(FLAGX) jr Z,#1024 neskoci jen pri 'INPUT LINE' jp #0F81 * *pouzito,pokud se pri editaci vyskytla chyba * bit 4,(FLAGS2) kanal -K- ? jr Z,#1026 ne ld (ERRNR),#FF smazani cisla chyby
1089 108B 108E 1091 1094 1097 1097 1097 1097 1098 109B 109C 109F 10A2 10A6 10A7 10A8 10A8 10A8 10A8 10A8 10A8 10AC 10AF 10B0 10B4 10B5 10B8 10BC 10BD 10C1 10C4 10C5 10C7 10C9 10C9 10CB 10CD 10CD 10CF 10D1 10D1 10D2 10D2 10D4 10D5 10D6 10D7 10D9 10DB 10DB 10DD 10E0 10E2 10E3 10E4 10E6 10E6 10E8 10E9
16 FD 21 CD C3
00 5E 90 B5 30
FE 1A 03 0F
ld ld ld call jp
E5 CD 2B CD 22 FD E1 C9
90 11 E5 19 5B 5C 36 07 00
FD C4 A7 FD C8 3A FD F5 FD C4 F1 FE 30
CB 02 5E 1D 11 CB 01 6E 08 5C CB 01 AE CB 02 6E 6E 0D 20 52
FE 10 30 2D FE 06 30 0A 47 E6 01 4F 78 1F C6 12 18 2A 20 21 3E AE 77 18 09 6A 5C 08 0E
FE 0E D8 D6 0D
* *mazani editacni zony nebo pracovniho prostoru * push HL nastaveni ukazatele na volne misto call EDHLDE _DE ukazuje na prvni,_HL na posledni dec HL volne misto call OUT1 zruseni ld (KCUR),HL adresa kurzoru a ld (MODE),0 mod =K= zapsany pop HL ret * *tato rutina precte posledni stisknutou klavesu *a vyhodnoti 'CAPS lock',zmenu modu kurzoru *a parametry barev * KEYIN bit 3,(TVFLAG) pri zmene modu znacka "EDIT" call NZ,#111D and A nulovani CARRY bit 5,(FLAGS) CARRY a ZERO jsou smazany,kdyz ret Z nebyla stlacena klavesa ld A,(LASTK) jinak precten kod klavesy res 5,(FLAGS) a toto poznaceno push AF uschova klavesy bit 5,(TVFLAG) jestlize je treba, call NZ,#0D6E smaze spodni dil obrazovky pop AF obnoveni klavesy v _A cp ' ' vsechny kody ASCII a tokeny jr NC,#111B prevzaty * cp #10 ridici znaky #10..#1F jr NC,#10FA * cp 6 kody modu korzoru a "CAPS lock" jr NC,MODCAP * ld B,A zpracovava jen kody "FLASH", "BRIGHT" a "INVERSE" and 1 bit0 pro vypnuti nebo zapnuti (0,1) ld C,A vykryty znak preda do _C ld A,B obnoveni znaku v _A rra upravi kody na #12 pro "FLASH" add #12 #13 pro "BRIGHT",#14 pro "INVERSE" jr #1105 * MODCAP jr NZ,MODES skok pri kodech modu ld HL,FLAGS2 zde se zpracuje pouze 'CAPS lock' ld A,8 k tomu je bit3 >FLAGS2< xor (HL) ld (HL),A invertovan jr #10F4 * MODES cp #0E dale jen pro 'SYMBOL shift' nebo ret C 'GRAPHIC',jinak navrat sub #0D
10EB 10EE 10EF 10F0 10F2 10F2 10F4 10F8 10F9 10FA 10FA 10FB 10FD 10FE 1100 1102 1104 1105 1108 110B 110D 110D 1110 1113 1113 1116 1117 1118 1119 111A 111B 111C 111D 111D 111D 111D 111D 1120 1124 1128 112B 112C 112F 1130 1133 1134 1138 113B 113C 113D 1140 1141 1144 1145 1148 114B 114C 114D 1150 1150
21 41 5C BE 77 20 02 * 36 00 FD CB 02 DE BF C9 * 47 E6 4F 3E CB 20 3C FD 11 18 07 10 58 01 71 D3 0D 11 06
ld cp ld jr
byl mod zmenen ? zapsan novy mod ano,zmena jinak =L= mod pozn:mohl se zmenit mod nulovani CARRY
ld (HL),0 set 3,(TVFLAG) cp A ret ld and ld ld bit jr inc ld ld jr B,A 7 C,A A,#10 3,B NZ,#1105 A (KDATA),C DE,KEYB2 #1113
ponecha jen bit0..bit2 a preda do _C kod pro "INK" pokud "neshiftovany" kod, potom do _A kod "PAPER" zapsany parametry pozmenen INPUT
* KEYB2 ld A,(KDATA) jeste jedna klavesa jako parametr ld DE,KEYIN a INPUT normalne pokracuje * 2A 4F 5C ld HL,(CHANS) aktualni adresa kanalu 23 inc HL se prestavi na ukazatel pro INPUT 23 inc HL 73 ld (HL),E novy vstupni bod do INPUT 23 inc HL je zapsan 72 ld (HL),D 37 scf C9 ret * *tato rutina je volana vzdy,kdyz ma byt zapsana *editacni zona nebo INPUT do spodni casti obrazovky * CD 4D 0D call ACTCOL zustavaji aktualni barvy FD CB 02 9E res 3,(TVFLAG) pozn:beze zmeny modu FD CB 02 AE res 5,(TVFLAG) pozn:spodni dil neni smazan 2A 8A 5C ld HL,(SPOSNL) uschova aktualnich hodnot pro E5 push HL spodni cast obrazovky 2A 3D 5C ld HL,(ERRSP) ukazatel na chybovy zasobnik E5 push HL take ulozen 21 67 11 ld HL,EDERR jako navratova adresa pri chybe E5 push HL ulozeno na zasobnik ED 73 3D 5C ld (ERRSP),SP sem je odlozen _SP 2A 82 5C ld HL,(ECHOE) uschovano >ECHOE< ("konec INPUT") E5 push HL 37 scf CD 95 11 call EDDE _DE ukazuje na pracovni prostor EB ex DE,HL _HL na zacatek,_DE na konec CD 7D 18 call #187D a vypis radku EB ex DE,HL CD E1 18 call #18E1 vypsani kurzoru 2A 8A 5C ld HL,(SPOSNL) aktualni hodnota >SPOSN< E3 ex (SP),HL vymenena s >ECHOE< EB ex DE,HL a >ECHOE< do _DE CD 4D 0D call ACTCOL znovu nastaveny aktualni barvy * *zaplneni zbytku radku mezerami 3A 0D 5C 11 A8 10
1150 1150 1153 1154 1156 1158 1159 115C 115E 1160 1161 1164 1165 1167 1167 1167 1167 1169 116C 116F 1172 1176 117A 117C 117C 117C 117C 117D 117E 117F 1182 1183 1184 1187 1188 118B 118F 1190 1190 1190 1190 1190 1193 1194 1195 1199 119D 119E 11A2 11A3 11A6 11A7 11A7 11A7 11A7 11A8 11AA 11AD 11B0 11B1
3A 92 38 20 7B FD 30 3E D5 CD D1 18
8B 5C 26 06 96 50 1E 20 F4 09 E9
16 FD 21 CD FD ED 18
00 5E 90 B5 36 5B 02
FE 1A 03 00 FF 8A 5C
D1 E1 E1 22 C1 D5 CD E1 22 FD C9
3D 5C D9 0D 82 5C 36 26 00
2A 2B A7 ED FD C8 ED D8 2A C9
61 5C 5B 59 5C CB 37 6E 5B 61 5C 63 5C
7E FE 0E 01 06 00 CC E8 19 7E 23
* RESTBL ld A,(SPOSNL+1) aktualni radek sub D porovnan se starym jr C,#117C neni treba vypisovat zadnou mezeru jr NZ,REST1 radky nejsou shodne ld A,E od stare pozice (sloupec) sub (SPOSNL) odectena nova jr NC,#117C neni potreba vkladat mezery REST1 ld A,' ' mezera do _A push DE zachovani ukazatele call GIVOUT vypis mezery pop DE obnoveni ukazatele jr RESTBL a dalsi * *zpracovani chyby v editoru * EDERR ld D,0 ld E,(RASP) ld HL,#1A90 call BEEP varovny signal ld (ERRNR),#FF vymazani kodu chyby ld DE,(SPOSNL) nacteni aktualni hodnoty pro >ECHOE< jr #117E * *normalni vystup pri vypisu editovaneho/INPUT radku * pop DE nova pozice pro >ECHOE< pop HL zruseni navratove adresy pro chybu pop HL stary ukazatel na chybovy zasobnik ld (ERRSP),HL zapsan pop BC puvodni >SPOSNL< push DE call #0DD9 nastaveni systemovych promennych pop HL >SPOSNL< zapsano do >ECHOE< ld (ECHOE),HL ld (IY+#26),0 smazan ukazatel na chybu v >XPTR< ret * *_DE nastavi na prvni misto editacni zony nebo pracovniho *prostoru,_HL na posledni * EDHLDE ld HL,(WORKSP) dec HL konec editacni zony and A smaze CARRY EDDE ld DE,(ELINE) zacatek editacni zony bit 5,(FLAGX) pri editaci navrat ret Z ld DE,(WORKSP) jinak _DE na pracovni prostor ret C ld HL,(STKBOT) pripadne _HL na "stack bottom" ret * *rutina zpracuje cisla v plovouci tecce v BASIC radku * GETFLO ld A,(HL) aktualni znak cp #0E je kod "number" ? ld BC,6 (bude vyhrazeno 6 bajtu) call Z,OUT2 ano:provedeno ld A,(HL) znovu pro dalsi testy inc HL ukazatel do BASIC radku +1
11B2 11B4 11B6 11B7 11B7 11B7 11B7 11B7 11B7 11B8 11BA 11BE 11BF 11C3 11C7 11CA 11CB 11CB 11CB 11CB 11CB 11CC 11CE 11D0 11D2 11D4 11D5 11D6 11D7 11D8 11D9 11DA 11DB 11DC 11DE 11DF 11E0 11E2 11E3 11E5 11E6 11E7 11E9 11EA 11EC 11ED 11EF 11EF 11F0 11F1 11F5 11F9 11FC 11FD 11FE 1200 1203 1206 1209 120A
FE 0D 20 F1 C9
F3 3E ED D9 ED ED 2A D9
FF 5B B2 5C 4B B4 5C 5B 38 5C 7B 5C
47 3E D3 3E ED 00 00 00 00 00 00 62 6B 36 2B BC 20 A7 ED 19 23 30 35 28 35 28 2B D9 ED ED 22 D9 04 28 22 11 01 EB ED
07 FE 3F 47
02 FA 52 06 03 F3
43 B4 5C 53 38 5C 7B 5C 19 B4 5C AF 3E A8 00 B8
* *============================================================ *iniciace systemu pri 'NEW' nebo reset pri zapnuti *rozliseni pomoci _A (pri 'NEW'=#FF) * NEW di zakaz preruseni ld A,#FF oznaceni 'NEW' ld DE,(RAMTOP) stare ohraniceni RAM exx dalsi hodnoty do alternat.registru ld BC,(PRAMT) posledni fyzicky bajt ld DE,(RASP) delka varovneho bzuceni ld HL,(UDG) zacatek def. grafiky exx *============================================================ *rutina RESET *iniciace vsech ukazatelu * RESET1 ld B,A uschova _A (znacky NEW/RESET) ld A,7 bily BORDER out (#FE),A nastaven ld A,#3F ld I,A (pro obsluhu preruseni) nop kratka prodleva nop nop nop nop nop ld H,D test RAM:pri 'NEW' od >RAMTOP< ld L,E pri RESET od #FFFF ld (HL),2 cela RAM dolu po #3FFF dec HL zaplnena #02 cp H jr NZ,#11DC RAMTES and A smazani CARRY sbc HL,DE je-li vysledek posledni bajt, add HL,DE CARRY se znovu nastavi (na 1) inc HL jr NC,RAMRDY dosazeno konce RAM dec (HL) jinak obsah bajtu -1 (=#01) jr Z,RAMRDY pokud =0:chybna RAM dec (HL) bajt-1 (=#00) jr Z,RAMTES bunka (bajt) je O.K. * RAMRDY dec HL ukazuje na posledni misto RAM exx pri 'NEW' se ld (PRAMT),BC obnovi systemove promenne ld (RASP),DE (pri 'RESET' bez vyznamu) ld (UDG),HL exx normalni soubor registru inc B jr Z,SETTOP pri 'NEW' ld (PRAMT),HL pri 'RESET' nastaveni posl.bajtu ld DE,#3EAF posledni bajt pismena "U" ld BC,#00A8 tj. 21 pismen po 8 bajtech ex DE,HL 21 pismen lddr se okopiruje
120C 120D 120E 1211 1212 1215 1219 121C 121F 1222 1222 1225 1227 1228 1229 122A 122B 122E 1230 1234 1235 1235 1238 123B 123E 1241 1242 1244 1244 1245 1246 1249 124A 124D 1250 1252 1253 1256 1258 1259 125B 125C 125F 1262 1265 1267 126A 126D 1270 1273 1276 1279 127C 127F 1282 1285 1287 128B 128E 1292
EB 23 22 2B 01 ED 22 21 22
ex inc 7B 5C ld dec 40 00 ld 43 38 5C ld B2 5C SETTOP ld 00 3C ld 36 5C ld * 2A B2 5C ld 36 3E ld 2B dec F9 ld 2B dec 2B dec 22 3D 5C ld ED 56 im FD 21 3A 5C ld FB ei 21 22 11 01 EB ED EB 2B 22 23 22 22 36 23 22 36 23 36 23 22 22 22 3E 32 32 32 21 22 FD FD 21 11 01 ED FD CD FD CD B6 4F AF 15 B0 * 57 5C 53 5C 4B 5C 80 59 5C 0D 80 61 63 65 38 8D 8F 48 23 09 35 35 C6 10 0E B0 CB DF 36 6B 5C 5C 5C 5C 5C 5C 05 5C C6 CA 15 5C 00 01 CE 0E 31 02 0D ex dec ld inc ld ld ld inc ld ld inc ld inc ld ld ld ld ld ld ld ld ld dec dec ld ld ld ldir set call ld call 5C 5C 15 00 ld ld ld ld ex ldir
DE,HL HL ukazuje na 1.okopirovane pismeno (UDG),HL a zapise se do syst.promenne HL -1 pro >RAMTOP< BC,#0040 nastaveni >RASP< (varovny ton) (RASP),BC a >PIP< (pipnuti klavesnice) (RAMTOP),HL zapsana pristupna oblast RAM HL,CHARRG-256 (CHARS),HL normalni znakovy soubor HL,(RAMTOP) (HL),#3E HL SP,HL HL HL (ERRSP),HL 1 IY,ERRNR HL,CANMEM (CHANS),HL DE,#15AF BC,21 DE,HL DE,HL HL (DATADD),HL HL (PROG),HL (VARS),HL (HL),#80 HL (ELINE),HL (HL),#0D HL (HL),#80 HL (WORKSP),HL (STKBOT),HL (STKEND),HL A,#38 (ATTRP),A (ATTRT),A (BORDCR),A HL,#0523 (REPDEL),HL (KSTATE) (KSTATE+4) HL,#15C6 DE,(STRMS) BC,14 1,(FLAGS) #0EDF (DFSZ),2 #0D6B posledni bajt na #3E predposledni ponechan #00 nastaveni ukazatele na zasobnik a o dva bajty niz chybovy zasobnik mod preruseni "1" _IY ma stale tuto hodnotu !!! povoleni preruseni pro obsluhu klavesnice a hodin bazova adresa pro kanalove informace zakladni data kanalovych informaci prepsana z tabulky na posledni adresu kan.informaci je nastaveno >DATADD< +1 je prvotni hodnota pro >PROG< a >VARS< koncova znacka promennych +1 je prvotni hodnota pro >ELINE< a na toto misto zapise 'ENTER' (0.radek) dalsi koncova znacka +1 je bazova adresa pro pracovni prostor, spodni hranice zasobniku kalkulatoru a pro volny prostor barvy (PAPER 7,INK 0,BRIGHT 0,FLASH 0) BORDER 7 iniciace >REPPER< a >REPDEL< >KSTATE< 0 a 4 nastaveny na "zadna klavesa" pocatecni hodnoty otevreneho kanalu okopirovany z tabulky priznak tiskarny pro nulovani bufferu smazan spodni dil obrazovky
1295 1296 1299 129C 12A0 12A2 12A2 12A2 12A2 12A2 12A2 12A6 12A9 12AC 12AC 12AE 12B1 12B4 12B7 12BB 12BD 12C1 12C3 12C6 12C9 12CD 12CF 12CF 12D2 12D5 12D8 12D9 12DA 12DD 12DD 12DE 12E0 12E2 12E6 12E9 12EC 12EE 12F1 12F4 12F8 12FC 1300 1303 1303 1303 1303 1303 1303 1304 1308 130C 130F 1312 1313 1314
AF 11 CD FD 18
38 15 0A 0C CB 02 EE 07
FD 36 31 02 CD 95 17 CD B0 16 3E CD CD CD FD 20 FD 28 2A CD FD 18 2A 22 CD 78 B1 C2 DF FE 28 FD C4 CD 3E FD 32 FD FD FD CD 00 01 2C 17 CB 12 CB 40 59 A7 36 DD 16 0F 1B 00 7E 30 66 5C 11 00 FF
59 5C 5D 5C FB 19 5D 15 0D C0 CB AF 6E 19 96 8C CB 36 36 8A
30 46 0D 0D 4F 5C 01 FE 00 FF 0A 01 1B
76 FD FD C4 3A 3C F5 21
CB CB CD 3A
01 AE 30 4E 0E 5C
00 00
* *============================================================ *HLAVNI SMYCKA provadeciho programu *============================================================ * MAIN ld (DFSZ),2 spodni dil na 2 radky call LISTOU vypis listingu call #16B0 edit.zona,pracovni prostor a zasobnik kalkulatoru smazany EDMAIN ld A,0 otevreni call OPCAN kanalu =K= call #0F2C volani editoru pro vstup radku call #1B17 kontrola syntaxe bit 7,(ERRNR) chyba syntaxe ? jr NZ,CORRIN ne bit 4,(FLAGS2) jestlize byl pouzit jiny kanal jr Z,#1303 nez =K=:skok ld HL,(ELINE) _HL ukazuje na zacatek radku call GETFLO ld (ERRNR),#FF smazani kodu chyby jr EDMAIN a bez listingu zpet do editoru * CORRIN ld HL,(ELINE) zacatek korektniho radku (bez chyby) ld (CHADD),HL do >CHADD< (ukazatel do BASIC pgmu) call #19FB cislo radku prevedeno do _BC ld A,B or C je cislo radku v poradku ? jp NZ,#155D nenulove:vlozeno do pgmu * rst GETACT je prvni znak cp #0D radku CR (ENTER) ? jr Z,MAIN ano bit 0,(FLAGS2) pokud je treba,smaze se cela call NZ,#0DAF obrazovka call #0D6E spodni dil se maze vzdy ld A,25 nastaveni pocitadla scrollu sub (IY+#4F) ld (SCRCT),A set 7,(FLAGS) pozn:radek proveden ld (ERRNR),#FF smazan kod chyby ld (NSPPC),1 call #1B8A a interpretace radku * *sem navrat po provedeni radku,pripadne sem jde pgm *k vypsani hlaseni *preruseni musi byt povoleno !!! * halt res 5,(FLAGS) pripraveno pro novou klavesu bit 1,(FLAGS2) pokud byl pouzit buffer call NZ,#0ECD je vymazan ld A,(ERRNR) precten kod chyby inc A push AF a uschovan ld HL,#0000 potrebne systemove promenne
1317 131A 131D 1320 1323 1326 1329 132D 1330 1334 1335 1336 1338 133A 133C 133F 1341 1342 1343 1346 1349 134A 134D 1350 1354 1357 1359 135A 135D 135F 1362 1365 1368 1369 136B 136D 136F 1371 1373 1376 1376 1379 137C 137F 1381 1381 1383 1384 1386 138A 138E 1391 1391 1391 1391 1391 1392 1394 13A4 13B6
FD FD 22 21 22 CD FD CD FD F1 47 FE 38 C6 CD 3E D7 78 11 CD AF 11 CD ED CD 3E D7 FD 06 CD CD 3A 3C 28 FE 28 FE 20 FD 01 11 21 CB 28 09 ED FD FD C3
74 74 0B 01 16 B0 CB 6E CB
ld ld ld ld ld call res call set pop ld 0A cp 02 jr 07 add EF 15 ERROU call 20 ld rst ld 91 13 ld 0A 0C call xor 36 15 ld 0A 0C call 4B 45 5C ld 1B 1A call 3A ld rst 4E 0D ld 00 ld 1B 1A call 97 10 call 3A 5C ld inc 1B jr 09 cp 04 jr 15 cp 03 jr 34 0D inc 03 00 70 5C 44 5C 7E 01 B8 36 0A FF CB 01 9E AC 12 ld ld ld bit jr add lddr ld res jp
37 26 5C 00 5C 16 37 AE 0D 02 EE
(FLAGX),H (IY+#26),H (DEFADD),HL HL,#0001 (STRMS+6),HL CLREDI 5,(FLAGX) #0D6E 5,(TVFLAG) AF B,A 10 C,ERROU 7 GIV1 A,' ' PRTOUT A,B DE,REPORT PRTREP A DE,#1536 PRTREP BC,(PPC) #1A1B A,':' PRTOUT C,(SUBPPC) B,0 #1A1B #1097 A,(ERRNR) A Z,#1386 9 Z,#1373 #15 NZ,#1376 (SUBPPC) BC,3 DE,OSPCC HL,NSPPC 7,(HL) Z,#1384 HL,BC
nulovany
iniciace prac.prostoru a calcstacku pozn: editacni mod smazani spodniho dilu obrazovky a toto poznaceno obnoveni kodu chyby kopie kod chyby 0..9 ? ano ofset vypis kodu chyby a pripsani mezery kod chyby znovu v _A adresa tabulky hlaseni (chybovych) a vypis hlaseni dale pripsany carka a mezera precteni aktualniho cisla radku a jeho vypis potom dvojtecka aktualni cislo prikazu v radku precteno do _BC a jeho vypis do hlaseni usek pameti editoru smazan precteni kodu chyby bez chyby:normalni zakonceni prikaz 'STOP' ? ano 'BREAK' ? ne jinak po 'CONT' pokracuje dalsim prikazem >OLDPPC< a >OSPPC< museji byt nastaveny pro 'CONT' povel 'BREAK' nasledoval po prikazu skoku ? ano:potom plati >NEWPPC< a >NSPPC< jinak >PPC< a >SUBPPC<
(NSPPC),#FF smazani >NSPPC<: bez skoku 3,(FLAGS) nastaveni modu =K= EDMAIN zpet do hlavni smycky
80 4F 4E 56 53
* *hlaseni operacniho systemu *posledni bajt kazdeho je zvetsen o #80 * REPORT DEFB #80 CB REPT0 DEFB 'O' #CB OK 45 58 54 REPT1 DEFB 'NEXT without FO' #D2 61 72 69 REPT2 DEFB 'Variable not foun' #E4 75 62 73 REPT3 DEFB 'Subscript wron' #E7
13C5 13D2 13DF 13ED 1401 140C 141A 142A 143E 144F 1463 146E 147F 148F 149C 14AC 14BE 14CC 14DE 14EC 14FA 1508 1516 1525 1537 1539 1555 1555 1557 155A 155D 155D 155D 155D 155D 155D 1561 1564 1565 1568 1569 156C 156D 156F 1570 1571 1572 1575 1577 157A 157D 157D 157E 157F 1580 1581 1583 1583 1584 1585
4F 4F 4E 52 45 53 49 49 4E 42 4F 49 4E 53 46 49 49 42 52 53 49 46 50 54 2C 7F 3E 01 C3
75 75 75 45 6E 54 6E 6E 6F 52 75 6E 6F 54 4F 6E 6E 52 41 74 6E 4E 61 61 A0 20
ED 2A EB 21 E5 2A 37 ED E5 60 69 CD 20 CD CD C1 79 3D B0 28 C5 03 03
REPT4 DEFB 'Out of memor' #F9 REPT5 DEFB 'Out of scree' #EE REPT6 DEFB 'Number too bi' #E7 REPT7 DEFB 'RETURN without GOSU' #C2 REPT8 DEFB 'End of fil' #E5 REPT9 DEFB 'STOP stateme' #F4 REPTA DEFB 'Invalid argumen' #F4 REPTB DEFB 'Integer out of rang' #E5 REPTC DEFB 'Nonsense in BASI' #C3 REPTD DEFB 'BREAK - CONT repeat' #F3 REPTE DEFB 'Out of DAT' #C1 REPTF DEFB 'Invalid file nam' #E5 REPTG DEFB 'No room for lin' #E5 REPTH DEFB 'STOP in INPU' #D4 REPTI DEFB 'FOR without NEX' #D4 REPTJ DEFB 'Invalid I/O devic' #E5 REPTK DEFB 'Invalid colou' #F2 REPTL DEFB 'BREAK into progra' #ED REPTM DEFB 'RAMTOP no goo' #E4 REPTN DEFB 'Statement los' #F4 REPTO DEFB 'Invalid strea' #ED REPTP DEFB 'FN without DE' #C6 REPTQ DEFB 'Parameter erro' #F2 REPTR DEFB 'Tape loading erro' #F2 REPTS DEFB #2C #A0 ', ' 31 39 COPRIG DEFB #7F ' 1982 Sinclair Research Lt' #E4 * 10 NOROOM ld A,#10 hlaseni "G" 00 00 ld BC,#0000 nulovani _BC 13 13 jp #1313 * *vlozeni noveho BASIC radku do programu *pokud jiz radek tohoto cisla existuje,je prepsan *pokud vlozeno pouze cislo radku,je smazan * 43 49 5C FEEDE ld (EPPC),BC novy radek zaktualizovan 5D 5C ld HL,(CHADD) ukazatel do pgmu ex DE,HL 55 15 ld HL,NOROOM adresa pro vypis hlaseni na zasobnik push HL 61 5C ld HL,(WORKSP) delka noveho radku spocitana scf od cisla radku po ENTER 52 sbc HL,DE vcetne push HL a uschovana ld H,B cislo radku do _HL ld L,C a test, 6E 19 call #196E zda tento radek jiz existuje 06 jr NZ,FEED1 pokud ne,je novy jen vlozen B8 19 call #19B8 spocitana delka stareho radku E8 19 call OUT2 a je odstranen * FEED1 pop BC obnovena delka noveho radku ld A,C a test na nulovou delku (bez ENTER) dec A or B 28 jr Z,#15AB ano:radek pouze odstranen * push BC delka noveho ulozena inc BC pricteni 4 pro vytvoreni mista inc BC pro cislo a delku radku
74 74 6D 54 64 4F 76 74 6E 45 74 76 20 4F 52 76 76 45 4D 61 76 20 72 70
20 20 62 55 20 50 61 65 73 41 20 61 72 50 20 61 61 41 54 74 61 77 61 65
1586 1587 1588 1589 158D 158E 1591 1592 1595 1596 1597 1598 1598 159B 159C 159D 159F 15A2 15A3 15A4 15A5 15A6 15A7 15A8 15A9 15AA 15AB 15AC 15AF 15AF 15AF 15AF 15AF 15AF 15AF 15AF 15B1 15B3 15B4 15B6 15B6 15B8 15B9 15BB 15BD 15BE 15C0 15C2 15C3 15C4 15C4 15C5 15C6 15C6 15C6 15C6 15C8 15CA 15CC 15CE
03 03 2B ED 5B 53 5C D5 CD 55 16 E1 22 53 5C C1 C5 13 2A 2B 2B ED 2A EB C1 70 2B 71 2B 73 2B 72 F1 C3 61 5C B8 49 5C
inc inc dec ld push call pop ld pop push inc ld dec dec lddr ld ex pop ld dec ld dec ld dec ld pop jp
ukazuje na bajt pred mistem pro ukladani uschova zacatku BASIC pgmu vytvori prostor pro novy radek a >PROG< nastavi na puvodni hodnotu obnovi delku radku v _BC a ponecha ji i na zasobniku _DE ukazuje na konec vytvoreneho prostoru
A2 12
HL,(WORKSP) HL _HL na konec vkladaneho radku HL a ulozeni noveho radku do pgmu HL,(EPPC) precteno cislo radku DE,HL preneseno do _DE BC znovu obnovena delka (HL),B tyto parametry HL zapsany pred nove vlozeny radek (HL),C HL (HL),E LSB cisla radku ! HL (HL),D MSB cisla radku ! AF odstranena adresa hlaseni 'No room' MAIN listing inicializaci
F4 09 A8 10 4B F4 09 C4 53 81 C4 52 F4 C4 50 80 CF 12 15 0F 15 09 15
01 06 0B 01 01
00 00 00 00 00
* *kanalove informace pro *-K- klavesnice *-S- obrazovka *-R- pracovni prostor *-P- tiskarna * INICAN DEFB #F4 #09 DEFB #A8 #10 DEFB 'K' DEFB #F4 #09 * DEFW INVIO DEFB 'S' DEFB #81 #0F DEFW INVIO DEFB 'R' DEFB #F4 #09 DEFW INVIO DEFB 'P' DEFB #80 * INVIO rst ERROUT DEFB #12 * *kanalova data * STDATA DEFB #01 #00 DEFB #06 #00 DEFB #0B #00 DEFB #01 #00 DEFB #01 #00
-K-S-R-K-K-
15D0 15D2 15D4 15D4 15D4 15D4 15D8 15DA 15DE 15E1 15E2 15E4 15E5 15E6 15E6 15E6 15E6 15E7 15E8 15EB 15EC 15ED 15EF 15EF 15EF 15EF 15EF 15F1 15F2 15F3 15F4 15F7 15F7 15F7 15F7 15F7 15F8 15F9 15FA 15FB 15FE 15FF 1600 1601 1601 1601 1601 1601 1601 1602 1604 1605 1607 1608 1609 160A 160B 160C 160E 160E
06 00 10 00
FD 20 FD CD D8 28 CF 07
CB 02 04 CB 02 E6 15 FA
D9 E5 2A 51 5C 23 23 18 08
1E 30 83 D9 E5 2A 51 5C
5E 23 56 EB CD 2C 16 E1 D9 C9
87 C6 16 6F 26 5C 5E 23 56 7A B3 20 02 CF
* *tento podpgm dohlizi na volani aktualni rutiny INPUT * 6E WAITA bit 5,(TVFLAG) spodni dil obrazovky jr NZ,#15DE neni vymazan:skok DE set 3,(TVFLAG) jinak pozn: zmena modu call #15E6 volana rutina INPUT ret C vse v poradku jr Z,#15DE zadne tlacitko:CARRY a ZERO nulove rst ERROUT jinak hlaseni DEFB #07 'End of file' * *rutina INPUT pro prave aktualni soubor * exx uschova registru push HL ld HL,(CURCHL) pocatecni adresa aktualni inc HL kanalove informace +2 inc HL k ziskani adresy INPUT jr INDCAL * *obecne uzivane rutiny *GIV2 s vypisovanym znakem v _A * GIV1 ld E,#30 k _A pricteno #30 add E GIV2 exx uschova registru push HL ld HL,(CURCHL) pocatecni adresa kanalove informace * *volani aktualni rutiny pro vstup nebo vystup *v _HL adresa,na niz je adresa skoku * INDCAL ld E,(HL) spravna adresa vlozena do _DE inc HL ld D,(HL) a predana do _HL ex DE,HL call INDJMP pro neprimo adresovany skok pop HL obnoveni registru exx ret * *rutina otevirajici kanal *_A obsahuje platne cislo proudu *a je otevren odpovidajici kanal * OPCAN add A krat 2 add #16 pricteno jako zaklad ld L,A a vysledek coby LSB adresy do _L ld H,#5C do _H vlozen MSB ld E,(HL) precteny dva bajty pro inc HL aktualni proud ld D,(HL) ld A,D a testovany na nulu or E jr NZ,#1610 nenulove:skok * ISTREA rst ERROUT jinak hlaseni
160F 1610 1610 1611 1614 1615 1618 161C 161D 161E 161F 1620 1621 1624 1627 1628 162A 162B 162C 162D 162D 162F 1631 1633 1634 1634 1638 163C 1640 1642 1642 1646 164A 164D 164D 1651 1652 1652 1652 1652 1652 1655 1656 1659 165A 165D 1660 1661 1663 1664 1664 1664 1664 1664 1664 1664 1665 1666 1669 166B
17 * 1B 2A 19 22 FD 23 23 23 23 4E 21 CD D0 16 5E 19 E9 4F 5C 51 5C CB 30 A6
DEFB #17
'Invalid stream'
2D 16 DC 16 00
4B 06 53 12 50 1B 00 FD FD FD 18 CB 02 C6 CB 01 AE CB 30 E6 04
FD CB 02 86 FD CB 01 8E C3 4D 0D FD CB 01 CE C9
01 E5 CD E1 CD 2A EB ED C9
01 00 05 1F 64 16 65 5C B8
F5 E5 21 4B 5C 3E 0E
dec DE data proudu -1 ld HL,(CHANS) ukazatel na kanalova data add HL,DE vytvorena potrebna bazova adresa ld (CURCHL),HL a zapsana res 4,(FLAGS2) NE kanal -Kinc HL _HL +4,aby mohl byt kod kanalu inc HL inc HL inc HL ld C,(HL) precten ld HL,CLOOK adresa tabulky call LOOKTA a hledani v teto tabulce ret NC nenalezeno:navrat ld D,0 jinak do _DE ofset ld E,(HL) a pro adresu neprimeho skoku add HL,DE pricten k _HL INDJMP jp (HL) * CLOOK DEFB 'K' #06 K + #06 = #1634 DEFB 'S' #12 S + #12 = #1642 DEFB 'P' #1B P + #1B = #164D DEFB #00 * CANALK set 0,(TVFLAG) spodni dil obrazovky res 5,(FLAGS) pripraven na stisk klavesy set 4,(FLAGS2) bude pouzit kanal -Kjr CANS1 * CANALS res 0,(TVFLAG) horni obrazovka CANS1 res 1,(FLAGS) tiskarna nepouzita jp ACTCOL * CANALP set 1,(FLAGS) bude pouzita tiskarna ret * *tato rutina vytvari potrebny prostor v pameti *velikost (pocet bajtu) je v _BC, _HL ukazuje na zacatek * ONEONL ld BC,1 vstup pro vyhrazeni 1 bajtu MAKESP push HL uschova ukazatele call #1F05 test, zda je dostatecne velka pamet pop HL obnoveni ukazatele call POINTE zkorigovani systemovych pointru ld HL,(STKEND) jiz novy >STKEND< ex DE,HL prehozeni noveho a stareho pointru lddr a vytvoreni mista ret _HL ukazuje na zacatek -1 _DE na posledni uvolnene misto * *tato rutina zmeni vsechny systemove promenne,ktere *ukazuji na pozice,kde se ma vyhradit misto *_BC obsahuje pocet bajtu uvolnovaneho prostoru * POINTE push AF push HL uschova pocatecni pozice ld HL,VARS ld A,14 pro 14 systemovych promennych *
166B 166C 166D 166E 166F 1670 1672 1673 1674 1676 1677 1678 1679 167A 167B 167C 167D 167E 167F 1680 1681 1683 1683 1684 1685 1686 1687 1689 168A 168B 168C 168D 168E 168F 168F 168F 168F 168F 168F 168F 168F 1691 1691 1692 1695 1695 1696 1698 169A 169B 169C 169D 169E 169E 169E 169E 169E 169E 16A1 16A2
5E 23 56 E3 A7 ED 52 19 E3 30 09 D5 EB 09 EB 72 2B 73 23 D1 23 3D 20 E8 EB D1 F1 A7 ED 52 44 4D 03 19 EB C9
00 00 EB 11 8F 16 7E E6 C0 20 F7 56 23 5E C9
2A 63 5C 2B
POINTL ld E,(HL) pointer,ktery je na rade inc HL precten do _DE ld D,(HL) ex (SP),HL zamena pointru a testovane promenne and A nulovani CARRY sbc HL,DE CARRY bude nastaveno,bude-li nutna add HL,DE zmena systemove promenne ex (SP),HL zpetne prehozeni pointru a promenne jr NC,MOREA pokud jsou shodne:skok push DE jinak stara hodnota uschovana ex DE,HL add HL,BC _BC pricteno ke stare hodnote ex DE,HL promenne ld (HL),D a vznikla hodnota zapsana dec HL zpet do systemove promenne ld (HL),E inc HL pop DE zruseni stare hodnoty MOREA inc HL dec A zpracovany vsechny promenne ? jr NZ,POINTL ne:dale * ex DE,HL stara hodnota ze >STKEND< pop DE obnoveni registru pop AF and A rozdil mezi starym >STKEND< sbc HL,DE a novym zacatkem volneho prostoru ld B,H spocitan,predan do _BC ld C,L inc BC a zvetsen o 1 add HL,DE sectenim znovu stara hodnota ex DE,HL >STKEND< a predan do _DE ret * *vyda cislo radku adresovaneho _HL *pokud neni platne,test zda _DE ukazuje na spravne misto *pokud ne,bude do _DE vlozeno #0000 jako cislo radku *pri navratu obsahuje normalne _DE cislo radku a *_HL pocatecni adresu tohoto radku * ROWZER DEFW #0000 cislo radku 0 * ROWFRS ex DE,HL zamena pointru ld DE,ROWZER *zde vstup RLOOK ld A,(HL) MSB cisla and #C0 testovan jr NZ,ROWFRS pri >10000 ld D,(HL) jinak toto cislo do _DE inc HL ld E,(HL) ret * *rutina je pouzivana restartem #30 *rezervuje (_BC) bajtu pameti *na zasobniku je hodnota >WORKSP< a pod ni pocet (_BC) * RESERV ld HL,(STKBOT) aktualni hodnota ze >STKBOT< dec HL -1 k ziskani adresy posledniho mista pracovniho prostoru
16A2 16A5 16A6 16A7 16A8 16AC 16AD 16AE 16AF 16B0 16B0 16B0 16B0 16B0 16B3 16B5 16B8 16B9 16BB 16BC 16BF 16C2 16C5 16C8 16CB 16CC 16CF 16D2 16D3 16D4 16D4 16D4 16D4 16D8 16DB 16DB 16DB 16DB 16DB 16DB 16DC 16DD 16DE 16DF 16E0 16E1 16E3 16E4 16E5 16E5 16E5 16E5 16E5 16E5 16E8 16EB 16EE 16F1 16F2 16F3
CD 55 16 23 23 C1 ED 43 61 5C C1 EB 23 C9
misto je vytvoreno ukazuje na dalsi nove misto puvodni >WORKSP< opet zapsan obnoven pocet bajtu _DE na zacatek +2 _HL na volne misto
* *rutina maze editacni zonu,pracovni prostor *a zasobnik kalkulatoru * 2A 59 5C CLREDI ld HL,(ELINE) editacni zona obsahuje pouze 36 0D ld (HL),#0D CR (ENTER) 22 5B 5C ld (KCUR),HL 23 inc HL 36 80 ld (HL),#80 zapsana koncova znacka 23 inc HL 22 61 5C ld (WORKSP),HL 2A 61 5C CLRWOR ld HL,(WORKSP) smazan pracovni prostor 22 63 5C ld (STKBOT),HL 2A 63 5C CLRCAL ld HL,(STKBOT) smazan zasobnik kalkulatoru 22 65 5C ld (STKEND),HL E5 push HL 21 92 5C ld HL,MEMBOT nastaveni >MEM< na oblast 22 68 5C ld (MEM),HL kalkulatoru E1 pop HL >STKEND< zpet do _HL C9 ret * *odstraneni editovaneho radku * ED 5B 59 5C ld DE,(ELINE) adresa vlozenych povelu C3 E5 19 jp OUT1 k odstraneni * *podprogram k prohledavani tabulek (jejich konec oznacen #00) *_HL ukazuje na zacatek tabulky,_C obsahuje hledany znak *nalezeni indikovano nastavenim CARRY * 23 LOOKT1 inc HL +1 pro dalsi par v tabulce 7E LOOKTA ld A,(HL) vstupni bod do rutiny A7 and A pro smazani CARRY a test konce tab. C8 ret Z hodnota #00 = konec B9 cp C porovnani s hledanym znakem 23 inc HL posun ukazatele na dalsi polozku 20 F8 jr NZ,LOOKT1 dalsi hledani 37 scf jinak nastavenim CARRY pozn:nalezeno C9 ret * *CLOSE # - podprogram pro uzavreni proudu *pro 0..3 jsou nastavena zakladni data tak,aby jej nebylo *mozno uzavrit,ale pouze prepnout * CD 1E 17 call STRDAT prinese data proudu CD 01 17 call CLOKSP testuje kod kanalu 01 00 00 ld BC,#0000 pro data proudu implicitne 0 11 E2 A3 ld DE,#A3E2 test,zda proud > 3 EB ex DE,HL (#A3E2+#5C16+2*cislo proudu) 19 add HL,DE 38 07 jr C,#16FC ne 0..3
16F5 16F8 16F9 16FA 16FB 16FC 16FD 16FE 16FF 1700 1701 1701 1701 1701 1702 1705 1706 1707 1708 1709 170A 170B 170E 1711 1712 1714 1715 1716 1716 1716 1716 1718 171A 171C 171C 171C 171C 171D 171E 171E 171E 171E 1721 1723 1725 1725 1726 1727 1727 1729 172A 172D 172E 1730 1731 1732 1733 1734 1735 1736
01 D4 15 09 4E 23 46 EB 71 23 70 C9
E5 2A 09 23 23 23 4E EB 21 CD 4E 06 09 E9
4F 5C
16 17 DC 16 00
4B 05 53 03 50 01
E1 C9
CD 94 1E FE 10 38 02 CF 17 C6 03 07 21 10 5C 4F 06 00 09 4E 23 46 2B C9
* *otestovano na kod -K-,-S- nebo -P- a proud uzavren * CLOKSP push HL uschova adresy dat proudu ld HL,(CHANS) adresa umisteni kanalovych informaci add HL,BC kan.data k uzaviranemu souboru inc HL nalezena inc HL (preskoceni adres podpgmu) inc HL ld C,(HL) precteni kodu kanalu ex DE,HL uschova _HL ld HL,CSTRTA bazova adresa tabulky call LOOKTA vyhledani polozky ld C,(HL) ofset predan do _BC ld B,0 add HL,BC a pricten k _HL pro neprimy jp (HL) skok * *tabulka pro uzavreni proudu * CSTRTA DEFB 'K' #05 -K- ofset #05 = #171C DEFB 'S' #03 -S- ofset #03 = #171C DEFB 'P' #01 -P- ofset #01 = #171C * *uzavreni proudu * CLOSTR pop HL adresa dat proudu ret * *data proudu vlozi do _BC * STRDAT call INTEG1 ze zasobniku kalk. cislo proudu cp 16 je-li >16 jr C,#1727 * rst ERROUT chybove hlaseni DEFB #17 'Invalid stream' * add 3 +3 rlca *2 ld HL,STRMS bazova adresa dat proudu ld C,A potrebna adresa proudu ld B,0 add HL,BC spocitana ld C,(HL) a precteni bajtu dat inc HL ld B,(HL) dec HL ukazatel _HL vracen na bajty dat ret *
1736 1736 1736 1736 1737 1738 1739 173C 173D 173E 1740 1741 1744 1745 1746 1747 1748 1749 174A 174C 174E 1750 1752 1754 1756 1759 175A 175B 175C 175D 175D 175E 1761 1762 1763 1765 1765 1766 1767 1767 1768 1769 176B 176C 176F 1772 1774 1775 1777 1778 1779 177A 177A 177A 177A 177C 177E 1780 1781 1781
EF 01 38 CD 78 B1 28 EB 2A 09 23 23 23 7E EB FE 28 FE 28 FE 20 CD 73 23 72 C9
1E 17 16 4F 5C
4B 08 53 04 50 CF 5D 17
E5 CD F1 2B 78 B1 20 02 CF 0E C5 1A E6 4F 21 CD 30 4E 06 09 C1 E9
DF 7A 17 DC 16 F1 00
4B 06 53 08 50 0A 00 1E 01
*OPEN # -podpgm *kod kanalu musi byt -K-,-S- nebo -P* STROPE rst CALSW prepnuti na kalkulator DEFB #01 ;swap DEFB #38 ;konec kalk. call STRDAT vyda data proudu ld A,B pokud jsou oba bajty nulove or C byl to uzavreny soubor jr Z,STROP1 ex DE,HL uschova _HL ld HL,(CHANS) bazova adresa kanalovych informaci add HL,BC a adresa otevreneho kanalu inc HL inc HL inc HL ld A,(HL) precten jeho kod ex DE,HL _HL zpatky cp 'K' test kodu kanalu na -K-,-Sjr Z,STROP1 nebo -Pcp 'S' jr Z,STROP1 cp 'P' jr NZ,#1725 pokud zadny z nich:chyba STROP1 call #175D data proudu ld (HL),E zapsana do dat inc HL ld (HL),D ret * push HL uschova _HL call #2BF1 prinese parametry kodu kanalu ld A,B or C data proudu O.K.? jr NZ,#1767 ano * rst ERROUT jinak hlaseni DEFB #0E 'Invalid file name' * push BC uschova delky vyrazu ld A,(DE) prinese 1.znak and #DF (upravi na velke pismeno) ld C,A a preda do _C pro ld HL,OPTAB (adresa tabulky) call LOOKTA vyhledani v tabulce jr NC,#1765 nenalezeno:chyba ld C,(HL) ofset pricten k _HL ld B,0 pro neprimy skok add HL,BC na provadeci pgm pop BC delka zpet do _BC jp (HL) a na prislusnou rutinu * *tabulka pro otvirani proudu * OPTAB DEFB 'K' #06 -K- ofset #06 = #1781 DEFB 'S' #08 -S- ofset #08 = #1785 DEFB 'P' #0A -P- ofset #0A = #1789 DEFB #00 konec tabulky * OPENK ld E,1 data = #01 a #00
1783 1785 1785 1787 1789 1789 178B 178C 178D 178E 1790 1791 1792 1793 1793 1793 1793 1793 1795 1795 1795 1795 1795 1799 179D 17A0 17A4 17A7 17AA 17AE 17B2 17B5 17B9 17BA 17BC 17BD 17BF 17BF 17C0 17C3 17C6 17C7 17C9 17CA 17CD 17CE 17CF 17D2 17D3 17D4 17D6 17D7 17D8 17D9 17DA 17DB 17DF 17E1 17E1 17E4
18 06 1E 06 18 02 1E 10 0B 78 B1 20 D5 57 E1 C9
18 90
ED FD CD FD FD CD FD FD 2A ED A7 ED 19 38 D5 CD 11 EB ED E3 CD C1 C5 CD C1 09 38 EB 56 23 5E 2B ED 18
73 36 AF CB 46 44 CB CB 49 5B 52 22
3F 02 0D 02 31 0E 02 30 5C 6C
5C 10 C6 86 C6 5C
6E 19 C0 02 52 6E 19 B8 19 0E
53 6C 5C ED
22 6C 5C 2A 6C 5C
jr #178B * OPENS ld E,6 data = #06 a #00 jr #178B * OPENP ld E,#10 data = #10 a #00 dec BC delka -1 ld A,B or C pokud delka nebyla 1 jr NZ,#1765 chyba ld D,A nulovano _D pop HL navraceno _HL ret * *CAT-,ERASE-,FORMAT- a prikazy presunu davaji *chybove hlaseni 'Invalid stream' * jr #1725 * *'LIST' a 'LLIST' *vypis cisla radku,rozepsani tokens,zobrazeni kurzoru atd. * LISTOU ld (LISTSP),SP uschova _SP ld (TVFLAG),#10 pozn:automaticky listing na obraz. call #0DAF horni dil smazan set 0,(TVFLAG) pouziti editacni zony ld B,(DFSZ) precten pocet radku call #0E44 spodniho dilu a tento smazan res 0,(TVFLAG) opet horni dil set 0,(FLAGS2) pozn:smazano ld HL,(EPPC) cislo bezneho radku ld DE,(STOP) a nejvrchnejsiho and A pokud je bezny mensi sbc HL,DE nez nejvrchnejsi add HL,DE bude listovano od neho jr C,#17E1 * push DE cislo nejvrchnejsiho uschovano call #196E spocitana adresa ld DE,#02C0 bezneho radku ex DE,HL sbc HL,DE ex (SP),HL vysledek na zasobnik call #196E pop BC vysledek do _BC push BC call #19B8 adresa nasledujiciho radku do _DE pop BC vysledek opet v _BC add HL,BC pocatecni adresa dalsiho radku jr C,#17E4 hotova a na listing ex DE,HL ld D,(HL) cislo dalsiho radku inc HL do _DE ld E,(HL) dec HL ld (STOP),DE novy nejvrchnejsi radek jr #17CE a dalsi hledani * ld (STOP),HL ld HL,(STOP) cislo nejvrchnejsiho radku v _HL
17E7 17EA 17EC 17ED 17F0 17F4 17F5 17F5 17F5 17F5 17F7 17F9 17F9 17F9 17F9 17FB 17FF 1802 1805 1806 1809 180B 180C 180E 1810 1812 1814 1815 1818 181A 181D 181F 181F 1822 1825 1828 1829 182B 182C 182D 1830 1833 1833 1835 1835 1835 1835 1838 1839 183D 183F 1842 1845 1847 1848 1849 1849 184A 184B 184E
CD 28 EB CD FD C9
6E 19 01 33 18 CB 02 A6
a jeho vyhledani byl nalezen:skok jinak pouzita adresa z _DE pro vypis listingu pozn:automaticky listing ukoncen
* *vstupni bod pro 'LLIST' * 3E 03 ld A,3 18 02 jr #17FB * *vstupni bod pro 'LIST' * 3E 02 ld A,2 FD 36 02 00 ld (TVFLAG),0 CD 30 25 call CHESYN C4 01 16 call NZ,OPCAN DF rst GETACT CD 70 20 call #2070 38 14 jr C,#181F DF rst GETACT FE 3B cp ';' 28 04 jr Z,#1814 FE 2C cp ',' 20 06 jr NZ,#181A E7 rst GETNXT CD 82 1C call #1C82 18 08 jr #1822 CD E6 1C call #1CE6 18 03 jr #1822 * CD DE 1C call #1CDE CD EE 1B call SYNTX CD 99 1E call INTEG2 78 ld A,B E6 3F and #3F 67 ld H,A 69 ld L,C 22 49 5C ld (EPPC),HL CD 6E 19 call #196E 1E 01 ld * *smycka pro * CD 55 18 call D7 rst FD CB 02 66 bit 28 F6 jr 3A 6B 5C ld FD 96 4F sub 20 EE jr AB xor C8 ret * E5 push D5 push 21 6C 5C ld CD 0F 19 call E,1
kanal -S- pro hlavni dil obrazovky pozn:normalni listing pokud neni kontrola syntaxe otevre se prislusny kanal prevzeti aktualniho znaku nema byt otevren jiny kanal ? ne aktualni znak kdyz strednik kdyz ne PRINT comma dalsi znak zda numericky vyraz bez stredniku nebo carky pouzita nula prinese cislo radku,prip. nulu pokud kontrola syntaxe,dalsi prikaz cislo radku do _BC uprava MSB do pripustneho rozsahu a cele cislo radku okopirovano do _HL pote zapsano vyhledana pocatecni adresa radku pokud neexistuje,pak nasledujiciho
vylistovani vice radku #1855 PRTOUT 4,(TVFLAG) Z,#1835 A,(DFSZ) (SPOSN+1) NZ,#1835 E Z HL DE HL,STOP #190F listing jednoho BASIC radku vypis navratu vozu (ENTER) automaticky listing ? ne je na obrazovce jeste volne misto ? ano navrat,kdyz je obrazovka plna a aktualni radek byl vylistovan pokud ne, >STOP< nastaveno na novou hodnotu vypsan dalsi radek se scrolingem
1851 1852 1853 1855 1855 1855 1855 1859 185C 185C 185E 1860 1863 1865 1868 1869 186B 186C 186D 186D 186E 1871 1872 1873 1874 1878 1879 187A 187C 187C 187D 1881 1882 1883 1887 188A 188C 1890 1892 1894 1894 1897 1898 189A 189C 189E 18A1 18A4 18A5 18A6 18A9 18AA 18AC 18AE 18AF 18B2 18B4 18B5 18B6 18B6
D1 E1 18 E0
ED 4B 49 5C CD 80 19 16 28 11 CB FD 7E FE C1 D0 3E 05 00 00 13 73 2D 40
C5 CD 28 1A 23 23 23 FD CB 01 86 7A A7 28 05 D7 FD D5 EB FD 21 CB FD 28 CB 2A A7 ED 20 3E CD CD EB 7E CD 23 FE 28 EB CD 18 D1 C9 CB 01 C6 CB 30 96 3B 5C 96 CB 37 6E 02 D6 5F 5C 52 05 3F C1 18 E1 18 B6 18 0D 06 37 19 E0
ve smycce listingu * *vypis uplneho BASIC radku * ld BC,(EPPC) precteni cisla aktualniho radku call #1980 a zjisteni,zda bezny (s kurzorem) je pred/za nim ld D,#3E impl. kurzor k aktualnimu radku jr Z,#1865 skok pri aktualnim radku ld DE,0 pro radek "po" _DE=#00, rl E "pred" _DE=#01 ld (BREG),E znacka pro radek zapsana ld A,(HL) MSB cisla radku prevzat cp #40 (mimo BASIC pgm ?) pop BC ret NC (ano):navrat pri ukonceni listingu * push BC call #1A28 vypis cisla radku (s pripad.mezerou) inc HL inc HL _HL bude ukazovat na 1.znak radku inc HL res 0,(FLAGS) pozn:pripustna uvodni mezera ld A,D and A pokud nebude vypisovan kurzor jr Z,#1881 pak skok * rst PRTOUT jinak vypis kurzoru set 0,(FLAGS) pozn:potlaceni uvodni mezery push DE ex DE,HL ukazatel na radek do _DE res 2,(FLAGS2) pozn:nejde o vypis retezce v '"' ld HL,FLAGS res 2,(HL) vypis v modu =K= bit 5,(FLAGX) mod INPUT ? jr Z,#1894 ne set 2,(HL) jinak pozn: mod =L= * ld HL,(XPTR) precteni ukazatele na chybu syntaxe and A nulovani CARRY sbc HL,DE a smycka do nalezeni chyby jr NZ,#18A1 nebo konce radku ld A,'?' blikajici otaznik call #18C1 vypsan na misto chyby call #18E1 zjisti,zda je vypsan kurzor ex DE,HL obnoveni _HL ld A,(HL) precten jeden znak z radku call #18B6 kontrola,zda znak "number"(#0E) inc HL ukazatel +1 cp #0D pokud znak 'ENTER' jr Z,#18B4 na konec ex DE,HL _HL opet do _DE call #1937 vypsani znaku jr #1894 a dale v radku pop DE konec radku (navrat vozu=ENTER) ret * *pokud najde kod "number" (#0E), preskoci ulozene
a dale
18B6 18B6 18B6 18B8 18B9 18B9 18BA 18BB 18BC 18BD 18BE 18BF 18C0 18C1 18C1 18C1 18C1 18C2 18C5 18C6 18C8 18CA 18CD 18D0 18D1 18D2 18D4 18D7 18D8 18DB 18DC 18DF 18E0 18E1 18E1 18E1 18E1 18E1 18E1 18E1 18E4 18E5 18E7 18E8 18E8 18EB 18ED 18EF 18F1 18F3 18F3 18F6 18F8 18FA 18FC 18FE 1900 1901 1905 1907
FE 0E C0 23 23 23 23 23 23 7E C9
D9 2A E5 CB CB 22 21 56 D5 36 CD E1 FD E1 22 D9 C9
8F 5C BC FD 8F 5C 91 5C 00 F4 09 74 57 8F 5C
2A 5B 5C A7 ED 52 C0 3A CB 28 C6 18 21 CB 3E CB 28 CB 3C FD 28 3E 41 5C 07 04 43 16 3B 5C 9E 4B 56 0B DE CB 30 02 43
*cislo v plovouci tecce * cp #0E navrat,pokud nejde o "number" ret NZ * inc HL jinak _HL +6 inc HL pro preskok "number" inc HL a 5 bajtu pro vyjadreni cisla inc HL inc HL inc HL ld A,(HL) prevzeti znaku za cislem ret * *vypis blikajicich znaku * exx uschova registru a ld HL,(ATTRT) >ATTRT< & >MASKT< push HL res 7,H blikani set 7,L zapnuto ld (ATTRT),HL a zapsano do >ATTRT< & >MASKT< ld HL,PFLAG ld D,(HL) >PFLAG< taktez push DE uschovano ld (HL),0 INVERSE & OVER =0,PAPER nebo INK <>9 call GIVOUT znak vypsan pop HL >PFLAG< a ld (PFLAG),H pop HL >ATTRT< & >MASKT< ld (ATTRT),HL na puvodni hodnotu exx prepnuti registru na normalni sadu ret * *vypis kurzoru *pokud aktualni pozice tisku neni totozna s pozici kurzoru, *ihned navrat, *jinak vypis odpovidajiciho kurzoru (C/E/G/K/L) * ld HL,(KCUR) precteni adresy kurzoru and A smazani CARRY sbc HL,DE souhlasi pozice ? ret NZ ne:navrat * ld A,(MODE) ano:precten mod rlc A *2 jr Z,#18F3 kdyz neni =G= nebo =E= add #43 jinak pricteni ofsetu jr #1909 * ld HL,FLAGS res 3,(HL) pozn: mod =K= ld A,'K' pismeno 'K' bit 2,(HL) pokud mod =K= jr Z,#1909 pak vypsano set 3,(HL) jinak mod =L= inc A _A nyni obsahuje 'L' 5E bit 3,(FLAGS2) mala pismena (=L=) ? jr Z,#1909 ano ld A,'C' posledni moznost =C=
1909 190A 190D 190E 190F 190F 190F 190F 190F 190F 1910 1911 1912 1913 1914 1915 1918 1918 191B 191C 1920 1921 1921 1922 1923 1924 1925 1925 1925 1925 1925 1926 1927 1928 192A 192A 192A 192A 192A 192A 192B 192C 192D 192F 1931 1932 1934 1937 1937 1937 1937 193A 193C 193E 1940 1944 1946 1948 194A 194C
D5 CD C1 18 D1 C9
* *pri volani teto rutiny ukazuje _HL na >STOP< nabo >EPPC< *pri navratu obsahuje pouzita (z vyse uvedenych) promenna *cislo radku * 5E ld E,(HL) precteni aktualniho cisla radku 23 inc HL do _DE 56 ld D,(HL) E5 push HL ukazatel uschovan EB ex DE,HL cislo radku do _HL 23 inc HL +1 CD 6E 19 call #196E vyhledani adresy zacatku radku s timto cislem nebo nasledujiho CD 95 16 call RLOOK precteni prislusneho cisla radku E1 pop HL obnoven ukazatel FD CB 37 6E bit 5,(FLAGX) mod INPUT ? C0 ret NZ ano:navrat * 72 ld (HL),D zapsani nalezeneho cisla 2B dec HL radku do 73 ld (HL),E do systemove promenne C9 ret * *rutina vypisuje znaky BASIC radku *u cisla jsou potlaceny uvodni mezery pri _A=#FF * 7B ld A,E prevzeti znacky z _E A7 and A test F8 ret M navrat pri #FF 18 0D jr #1937 * *zmena cisla radku v _HL na dekadicke cislo *k tomu obsahuje _BC podle potreby hodnotu -1000,-100 nebo *-10 (proto scitani !) * AF xor A _A =0 09 add HL,BC zkusmy soucet 3C inc A citac +1 38 FC jr C,#192B jeste nenastalo podteceni ED 42 sbc HL,BC kdyz ano,pak zpetne jedno odecteni 3D dec A a citac -1 28 F1 jr Z,#1925 pokud nulovy,test na vypis mezer C3 EF 15 jp GIV1 jinak vypis dekadickeho cisla * *zde vypis vsech znaku,ridicich kodu a tokens * CD 1B 2D call NUMBER test na decimalni cislo 30 30 jr NC,#196C pokud ano,primo vypis FE 21 cp '!' ridici znaky a mezera ? 38 2C jr C,#196C ano:na vypis FD CB 01 96 res 2,(FLAGS) pozn:vypis v modu =K= FE CB cp #CB token 'THEN' ? 28 24 jr Z,#196C ano:na vypis FE 3A cp ':' 20 0E jr NZ,#195A ne dvojtecka: skok FD CB 37 6E bit 5,(FLAGS) v modu INPUT dvojtecka
1950 1952 1956 1958 195A 195C 195E 195F 1962 1964 1967 1968 196C 196D 196E 196E 196E 196E 196E 196E 196E 196F 1972 1973 1974 1975 1978 1978 1979 197A 197D 197E 1980 1980 1980 1980 1980 1981 1982 1983 1984 1985 1986 1987 1988 1988 1988 1988 1988 1989 198A 198B 198B 198E 1990 1990 1991 1992 1992 1993
20 FD 28 18 FE 20 F5 3A EE 32 F1 FD D7 C9
16 CB 30 56 14 0E 22 0A 6A 5C 04 6A 5C CB 01 D6
NZ,#1968 2,(FLAGS2) Z,#196C #1968 '"' NZ,#1968 AF A,(FLAGS2) 4 (FLAGS2),A AF 2,(FLAGS) PRTOUT
vypsana skok,pokud dvojtecka neni v textu (uzavrenem v uvozovkach) jinak vypis znak pro textovy mod ? ne uschova znaku invertovan bit-znacka textu obnoveni znaku v _A pozn:dalsi znak v modu =L= vypis znaku
E5 2A 53 5C 54 5D C1 CD 80 19 D0 C5 CD B8 19 EB 18 F4
7E B8 C0 23 7E 2B B9 C9
23 23 23 22 5D 5C 0E 00 15 C8 E7 BB
* *podpgm pro vyhledani zacatku radku,jehoz cislo je v _HL *pokud tento radek nenalezne,bude vydana v _HL pocatecni *adresa nasledujiciho a v _DE predchazejiciho radku *pri nalezeni radku s danym cislem se nastavi ZERO * push HL uschova cisla radku ld HL,(PROG) >PROG< do _DE ld D,H ld E,L pop BC cislo radku v _BC call #1980 porovnani hledaneho cisla s prave adresovanym ret NC radek nalezen: navrat push BC jinak call #19B8 hledani dalsiho ex DE,HL zamena ukazatelu a jr #1974 dalsi hledani * *porovnani cisla radku v _BC s cislem radku,ktery *je adresovan _HL * ld A,(HL) MSB cisla radku cp B porovnan s hledanym cislem ret NZ nerovno inc HL jinak LSB ld A,(HL) prevzat dec HL a cp C porovnan ret rovno neb vetsi: CARRY smazano * *tato rutina vyhledava v radku znak,token ap.,ktery *je ulozen v _E * inc HL ukazatel na zacatek obsahu radku inc HL inc HL *normalni vstup do rutiny ld (CHADD),HL nastaveni >CHADD< na aktualni znak ld C,0 mod textu vypnut *prohledavaci smycka dec D _D jako citac -1 ret Z znak nalezen * rst GETNXT precteni nasledujiciho znaku cp E porovnani s hledanym
1994 1996 1997 1998 1999 199A 199D 19A0 19A2 19A4 19A5 19A7 19A9 19AB 19AD 19AF 19B1 19B3 19B5 19B6 19B7 19B8 19B8 19B8 19B8 19B9 19BA 19BC 19BE 19C0 19C2 19C3 19C6 19C7 19CA 19CC 19CE 19CF 19D0 19D1 19D3 19D5 19D5 19D6 19D7 19D8 19D9 19DA 19DB 19DC 19DD 19DD 19DD 19DD 19DD 19DE 19E0 19E1 19E2 19E3
20 A7 C9 23 7E CD 22 FE 20 0D FE 28 FE 20 CB 28 FE 20 15 37 C9
04
B6 18 5D 5C 22 01 3A 04 CB 04 41 DF 0D E3
NZ,#199A A HL A,(HL) #18B6 (CHADD),HL '"' NZ,#19A5 C ':' Z,#19AD #CB NZ,#19B1 0,C Z,#1990 #0D NZ,#1998 D
nerovno rovno:CARRY a ZERO nulovany pred navratem dalsi znak (pripadny preskok cisla) nove nastaveni >CHADD< uvozovky pro ozn. textoveho modu ? ne jinak poznaceno v _C pri dvojtecce pokracuje hledani token 'THEN' ? ne text. mod ? ne ENTER ? ne citac -1 nastaveni CARRY pro navrat
E5 7E FE 38 CB 28 87 FA 3F 01 30 0E 17 23 7E 30 18 23 23 4E 23 46 23 09 D1
40 17 6F 14 C7 19 05 00 02 12
FB 06
A7 ED 52 44 4D 19 EB
* *podpgm pro vyhledani dalsiho BASIC radku nebo promenne * push HL uschova ukazatele ld A,(HL) prevzeti prvniho znaku cp #40 jr C,#19D5 pri hledani radku: skok bit 5,A pri retezcove promenne nebo poli jr Z,19D6 taktez skok add A testovan bit6:jednoducha nebo jp M,#19C7 "FOR-NEXT" promenna: skok ccf jen promenna s dlouhym nazvem ld BC,5 numericka promenna potrebuje 5 jr NC,#19CE ld C,18 a "FOR-NEXT" 18 bajtu pameti rla pouze u promenne s dlouhym nazvem inc HL se nuluje CARRY ld A,(HL) jr NC,#19CE hledani konce tohoto nazvu jr #19DB pri promenne vzdy skok * inc HL hledani radku:(LSB cisla radku) inc HL nyni ukazuje na LSB delky ld C,(HL) delka do _BC inc HL ld B,(HL) inc HL _HL ukazuje na add HL,BC nasledujici radek/promennou pop DE * *podpgm pro vypocet rozdilu _BC=_HL-_DE *_HL a _DE jsou pred navratem prehozeny * DIFFER and A nulovani CARRY sbc HL,DE vvtvoren rozdil a ld B,H prenesen do _BC ld C,L add HL,DE puvodni hodnoty ex DE,HL zamena ukazatelu
19E4 19E5 19E5 19E5 19E5 19E5 19E5 19E5 19E5 19E8 19E9 19EA 19EB 19EC 19ED 19EE 19EF 19F0 19F3 19F4 19F5 19F6 19F7 19F9 19FA 19FB 19FB 19FB 19FB 19FB 19FB 19FE 19FF 1A02 1A03 1A06 1A09 1A0C 1A0F 1A11 1A14 1A15 1A18 1A1B 1A1B 1A1B 1A1B 1A1B 1A1C 1A1D 1A1E 1A20 1A22 1A23 1A24 1A26 1A28 1A28 1A28 1A28
C9
CD DD 19 C5 78 2F 47 79 2F 4F 03 CD 64 16 EB E1 19 D5 ED B0 E1 C9
2A 2B 22 E7 21 22 CD CD 38 21 09 DA C3
59 5C 5D 5C 92 65 3B A2 04 F0 5C 5C 2D 2D D8
8A 1C C5 16
D5 E5 AF CB 20 60 69 1E 18
78 20 FF 08
ret * *tato rutina maze usek pameti a koriguje potrebne *systemove promenne *pro prvni vstupni bod: _DE=prvni mazany bajt, *_HL ukazuje na prvni,ktery ma byt zachovan *pro druhy vstup: _HL prvni mazany, _BC pocet bajtu * OUT1 call DIFFER vypocet rozdilu a nastaveni pointru OUT2 push BC uschova poctu bajtu ld A,B vytvoreni doplnku k teto hodnote, cpl pro korekci systemovych promennych ld B,A ld A,C cpl ld C,A inc BC call POINTE nove nastaveni sysvar ex DE,HL "prvni" bajt znovu do _DE pop HL rozdil do _HL add HL,DE soucet da prvni "zachovavany" bajt push DE adresa prvniho pres zasobnik ldir (prepsani useku) pop HL do _HL ret * *zjisti cislo radku pri editaci *pro primy povel bude vysledek roven 0 *vysledek vzdy predan do _BC * ld HL,(ELINE) ukazatel na editovany radek dec HL na pozici pred cislem ld (CHADD),HL radku nastaveno >CHADD< rst GETNXT prevzeti nasledujiciho znaku ld HL,MEMBOT pamet kalkulatoru pouzita jako ld (STKEND),HL zasobnik kalkulatoru call #2D3B precteno cislo radku nebo 0 call #2DA2 vlozeno do _BC (v HEX) jr C,#1A15 pokud cislo >65535: chyba ld HL,#D8F0 jinak test na 10000 add HL,BC jp C,#1C8A cislo radku >10000: chyba jp #16C5 normalni umisteni calcstacku * *vypis cisla radku *prevedeni obsahu _BC na decimalni tvar a vypis * push DE uschova registru push HL xor A nulovani _A bit 7,B jr NZ,#1A42 ld H,B decimalni cislo pro vypis do _HL ld L,C ld E,#FF implicitne: bez uvodnich mezer jr #1A30 a vypis * *prevede hex cislo radku adresovane prostrednictvim _HL *na decimalni tvar a vypise (s uvodni mezerou) *
1A28 1A29 1A2A 1A2B 1A2C 1A2D 1A2E 1A30 1A33 1A36 1A39 1A3C 1A3E 1A41 1A42 1A45 1A46 1A47 1A48 1A48 1A48 1A48 1A48 1A48 1A48 1A49 1A4A 1A4B 1A4C 1A4D 1A4E 1A4F 1A50 1A51 1A52 1A53 1A54 1A55 1A56 1A57 1A58 1A59 1A5A 1A5B 1A5C 1A5D 1A5E 1A5F 1A60 1A61 1A62 1A63 1A64 1A65 1A66 1A67 1A68 1A69 1A6A 1A6B
D5 56 23 5E E5 EB 1E 01 CD 01 CD 0E CD 7D CD E1 D1 C9
20 18 2A 9C 2A F6 2A
FC 19 FF 19 19
EF 15
push ld inc ld push ex ld ld call ld call ld call ld call pop pop ret
DE D,(HL) HL E,(HL) HL DE,HL E,' ' BC,#FC18 #192A BC,#FF9C #192A C,#F6 #192A A,L GIV1 HL DE
cislo radku do _DE uschova ukazatele cislo radku do _HL uvodni mezera -1000 vypis prvni cislice -100 dalsi cislice -10 cislice desitkoveho radu jednotkovy rad vypsan jako decimalni cislo obnoveni registru
B1 CB BC BF C4 AF B4 93 91 92 95 98 98 98 98 98 98 98 7F 81 2E 6C 6E 70 48 94 56 3F 41 2B 17 1F 37 77 44 0F
* *============================================================ *INTERPRETER BASICu * *vyrovnavaci tabulka BASIC prikazu pro jine tabulky * STAOFF DEFB #B1 DEF FN DEFB #CB CAT DEFB #BC FORMAT DEFB #BF MOVE DEFB #C4 ERASE DEFB #AF OPEN # DEFB #B4 CLOSE # DEFB #93 MERGE DEFB #91 VERIFY DEFB #92 BEEP DEFB #95 CIRCLE DEFB #98 INK DEFB #98 PAPER DEFB #98 FLASH DEFB #98 BRIGHT DEFB #98 INVERSE DEFB #98 OVER DEFB #98 OUT DEFB #7F LPRINT DEFB #81 LLIST DEFB #2E STOP DEFB #6C READ DEFB #6E DATA DEFB #70 RESTORE DEFB #48 NEW DEFB #94 BORDER DEFB #56 CONTINUE DEFB #3F DIM DEFB #41 REM DEFB #2B FOR DEFB #17 GO TO DEFB #1F GO SUB DEFB #37 INPUT DEFB #77 LOAD DEFB #44 LIST DEFB #0F LET
1A6C 1A6D 1A6E 1A6F 1A70 1A71 1A72 1A73 1A74 1A75 1A76 1A77 1A78 1A79 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7A 1A7B 1A7C 1A7D 1A7E 1A7F 1A81 1A82 1A83 1A84 1A86 1A87 1A88 1A8A 1A8B 1A8D 1A8E 1A90 1A91 1A92 1A93 1A94 1A95 1A96 1A98 1A99 1A9A 1A9C
59 2B 43 2D 51 3A 6D 42 0D 49 5C 44 15 5D
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB
#59 #2B #43 #2D #51 #3A #6D #42 #0D #49 #5C #44 #15 #5D
PAUSE NEXT POKE PRINT PLOT RUN SAVE RANDOMIZE IF CLS DRAW CLEAR RETURN COPY
01 3D 02 06 00 67 06 CB 05 F0 06 00 ED 00 EE 00 23 04 3D 06 CC 06 05 03 04 00 AB 05
1E
1C 1E 1C 1F
1D 1D
* *tabulka parametru pro prikazy *bajty v rozmezi #00..#0B udavaji dalsi potrebne parametry *pro jednotlive prikazy * *PAR00: bez dalsich parametru *PAR01: pri lET bude potrebovat nazev promenne *PAR02: musi nasledovat numericky/retezcovy vyraz *PAR03: muze nasledovat numericky vyraz,jinak 0 *PAR04: musi nasledovat prosta promenna *PAR05: mohou nasledovat dalsi parametry *PAR06: musi nasledovat numericky vyraz *PAR07: zpracovani barev atp. *PAR08: dva numericke vyrazy oddelene carkou *PAR09: totez,ale smeji predchazet kody barev *PAR0A: musi nasledovat retezcovy vyraz *PAR0B: zpracovani rutin pro styk s mgf * PALET DEFB #01 DEFB '=' DEFB #02 PAGOTO DEFB #06 DEFB #00 DEFW #1E67 GO TO PAIF DEFB #06 DEFB #CB THEN DEFB #05 DEFW #1CF0 IF PAGOSU DEFB #06 DEFB #00 DEFW #1EED GO SUB PASTOP DEFB #00 DEFW #1CEE STOP PARETU DEFB #00 DEFW #1F23 RETURN PAFOR DEFB #04 DEFB '=' DEFB #06 DEFB #CC TO DEFB #06 DEFB #05 DEFW #1D03 FOR PANEXT DEFB #04 DEFB #00 DEFW #1DAB NEXT PAPRIN DEFB #05
1A9D 1A9F 1AA0 1AA2 1AA3 1AA5 1AA6 1AA8 1AA9 1AAB 1AAC 1AAE 1AAF 1AB1 1AB2 1AB3 1AB5 1AB6 1AB8 1AB9 1ABB 1ABC 1ABE 1ABF 1AC1 1AC2 1AC3 1AC5 1AC6 1AC7 1AC9 1ACA 1ACC 1ACD 1ACF 1AD0 1AD2 1AD3 1AD4 1AD6 1AD7 1AD9 1ADA 1ADC 1ADD 1ADF 1AE0 1AE1 1AE2 1AE3 1AE4 1AE5 1AE7 1AE8 1AE9 1AEB 1AEC 1AED 1AEE 1AEF
CD 05 89 05 02 05 B2 00 B7 03 A1 05 F9 08 00 80 03 4F 00 5F 03 AC 00 6B 09 00 DC 06 00 3A 05 ED 05 27 03 42 09 05 82 00 AC 05 C9 05 F5 0B 0B 0B 0B 08 00 F8 09 05 20 07 07 07 07 07
1F 20 2C 1B 11 1E 17 1E 1E 1E 1E 0D 22 1F 1D 1E 1E 23 0E 1F 17
03 23
DEFW PAINPU DEFB DEFW PADIM DEFB DEFW PAREM DEFB DEFW PANEW DEFB DEFW PARUN DEFB DEFW PALIST DEFB DEFW PAPOKE DEFB DEFB DEFW PARAND DEFB DEFW PACONT DEFB DEFW PACLEA DEFB DEFW PACLS DEFB DEFW PAPLOT DEFB DEFB DEFW PAPAUS DEFB DEFB DEFW PAREAD DEFB DEFW PADATA DEFB DEFW PAREST DEFB DEFW PADRAW DEFB DEFB DEFW PACOPY DEFB DEFW PALPRI DEFB DEFW PALLIS DEFB DEFW PASAVE DEFB PALOAD DEFB PAVERI DEFB PAMERG DEFB PABEEP DEFB DEFB DEFW PACIRC DEFB DEFB DEFW PAINK DEFB PAPAPE DEFB PAFLAS DEFB PABRIG DEFB PAINVE DEFB
#1FCD #05 #2089 #05 #2C02 #05 #1BB2 #00 #11B7 #03 #1EA1 #05 #17F9 #08 #00 #1E80 #03 #1E4F #00 #1E5F #03 #1EAC #00 #0D6B #09 #00 #22DC #06 #00 #1F3A #05 #1DED #05 #1E27 #03 #1E42 #09 #05 #2382 #00 #0EAC #05 #1FC9 #05 #17F5 #0B #0B #0B #0B #08 #00 #03F8 #09 #05 #2320 #07 #07 #07 #07 #07
PRINT INPUT DIM REM NEW RUN LIST POKE RANDOMIZE CONTINUE CLEAR CLS PLOT PAUSE READ DATA RESTORE DRAW COPY LPRINT LLIST
SAVE,LOAD,VERIFY,MERGE,BEEP CIRCLE
1AF0 1AF1 1AF2 1AF3 1AF5 1AF6 1AF7 1AF9 1AFA 1AFC 1AFD 1AFE 1AFF 1B00 1B02 1B03 1B04 1B06 1B07 1B08 1B0A 1B0B 1B0C 1B0D 1B0E 1B10 1B11 1B12 1B14 1B15 1B17 1B17 1B17 1B17 1B17 1B17 1B17 1B17 1B1B 1B1E 1B1F 1B22 1B23 1B26 1B28 1B29 1B2C 1B2F 1B32 1B33 1B35 1B37 1B39 1B3B 1B3D 1B3D 1B40 1B41 1B42 1B43
07 08 00 7A 06 00 94 05 60 06 2C 0A 00 36 06 00 E5 0A 00 93 0A 2C 0A 00 93 0A 00 93 00 93
PAOVER DEFB #07 PAOUT DEFB #08 DEFB #00 1E DEFW #1E7A INK,PAPER,FLASH,BRIGHT,INVERSE,OUT PABORD DEFB #06 DEFB #00 22 DEFW #2294 BORDER PADEFN DEFB #05 1F DEFW #1F60 DEF FN PAOPEN DEFB #06 DEFB ',' DEFB #0A DEFB #00 17 DEFW #1736 OPEN PACLOS DEFB #06 DEFB #00 16 DEFW #16E5 CLOSE PAFORM DEFB #0A DEFB #00 17 DEFW #1793 FORMAT PAMOVE DEFB #0A DEFB ',' DEFB #0A DEFB #00 17 DEFW #1793 MOVE PAERAS DEFB #0A DEFB #00 17 DEFW #1793 ERASE PACAT DEFB #00 17 DEFW #1793 CAT * *============================================================ * *hlavni rutina interpretru s kontrolou syntaxe * *============================================================ * FD CB 01 BE res 7,(FLAGS) pozn:kontrola syntaxe CD FB 19 call #19FB >CHADD< na prvni bajt cisla radku AF xor A vynulovan 32 47 5C ld (SUBPPC),A citac prikazu v radku 3D dec A = #FF 32 3A 5C ld (ERRNR),A zadna chyba 18 01 jr #1B29 E7 rst GETNXT precten nasledujici znak CD BF 16 call CLRWOR smazani pracovniho prostoru FD 34 0D inc (SUBPPC) dalsi prikaz na radku FA 8A 1C jp M,1C8A max.127 prikazu do radku DF rst GETACT precte znak 06 00 ld B,0 nulovani _B pro praci s tabulkou FE 0D cp #0D konec radku ? 28 7A jr Z,#1BB3 ano FE 3A cp ':' oddelovac ? 28 EB jr Z,#1B28 ano:pokracuje * 21 76 1B ld HL,BRKTST navratova adresa pro E5 push HL test 'BREAK' na zasobnik 4F ld C,A kopie znaku do _C E7 rst GETNXT ukazatel do radku +1 79 ld A,C vraceni znaku do _A
1B44 1B46 1B49 1B4A 1B4D 1B4E 1B4F 1B50 1B52 1B52 1B52 1B52 1B55 1B56 1B57 1B5A 1B5D 1B5E 1B5F 1B61 1B63 1B66 1B68 1B69 1B6A 1B6B 1B6C 1B6D 1B6E 1B6F 1B6F 1B6F 1B6F 1B6F 1B70 1B71 1B74 1B75 1B76 1B76 1B76 1B76 1B79 1B7B 1B7B 1B7C 1B7D 1B7D 1B81 1B83 1B83 1B86 1B88 1B8A 1B8A 1B8A 1B8A 1B8A 1B8A 1B8D
D6 DA 4F 21 09 4E 09 18
CE 8A 1C 48 1A
03
tokeny odectenim do rozsahu #00..#31 kdyz nebyl token: chyba znak do _C pro hledani v tabulce adresa ofsetove tabulky prikazu prictena k hodnote tokenu ofset prevzat do _C tim je ziskan ukazatel na parametry prikazu
* *vyhodnoceni parametru prikazu * 2A 74 5C PARGET ld HL,(TADDR) ukazatel na dalsi parametr 7E ld A,(HL) precteni parametru 23 inc HL ukazatel +1 22 74 5C ld (TADDR),HL a zapsan pro dalsi parametr 01 52 1B ld BC,PARGET navratova adresa pro mozne dalsi C5 push BC parametry na zasobnik 4F ld C,A predani znaku FE 20 cp ' ' je to oddelovac (',' ap.) ? 30 0C jr NC,#1B6F ano 21 01 1C ld HL,#1C01 adresa tabulky ofsetu parametru 06 00 ld B,0 09 add HL,BC k ni pricten parametr 4E ld C,(HL) ofset z tabulky do _C 09 add HL,BC a pricten pro volani rutiny E5 push HL prostrednictvim "ret" DF rst GETACT posledni prikaz znovu precten 05 dec B a _B= #FF C9 ret skok na vypoctenou adresu * *v _C ulozen oddelovac z tabulky parametru *zde se kontroluje jeho pritomnost v prikazu v radku BASIC * DF rst GETACT znovu precten znak B9 cp C a porovnan C2 8A 1C jp NZ,#1C8A pri nerovnosti: chyba E7 rst GETNXT jinak ukazatel na dalsi znak C9 ret * *po kazdem bezchybnem prikazu se testuje klavesa 'BREAK' * CD 54 1F BRKTST call #1F54 test,zda stlacena 'BREAK' 38 02 jr C,#1B7D ne * CF rst ERROUT jinak hlaseni 14 DEFB #14 'BREAK into program' * FD CB 0A 7E bit 7,(NSPPC) je provaden skok ? 20 71 jr NZ,#1BF4 ne * 2A 42 5C ld HL,(NEWPPC) jinak precteno nove cislo radku CB 7C bit 7,H skok pri behu pgmu ? 28 14 jr Z,#1B9E ano:vyhledani radku jinak je to prikaz "RUN" * *rutina pro "RUN" *pak nastavena znacka syntaxe/beh (bit7 >FLAGS<) * 21 FE FF ld HL,#FFFE = -2 22 45 5C ld (PPC),HL prave provadeny radek
1B90 1B93 1B94 1B98 1B99 1B9C 1B9E 1B9E 1B9E 1B9E 1BA1 1BA4 1BA6 1BA7 1BA9 1BA9 1BAA 1BAB 1BAD 1BAE 1BB0 1BB0 1BB1 1BB2 1BB2 1BB2 1BB2 1BB2 1BB2 1BB3 1BB3 1BB3 1BB3 1BB6 1BB7 1BB7 1BBA 1BBC 1BBD 1BBE 1BBE 1BBF 1BBF 1BBF 1BBF 1BBF 1BC1 1BC3 1BC4 1BC5 1BC6 1BCA 1BCB 1BCC 1BCD 1BCE 1BCF 1BD0 1BD1 1BD1
2A 2B ED 1B 3A 18
61 5C 5B 59 5C 44 5C 33
ld dec ld dec ld jr
_HL ukazuje na koncovou znacku editacni zony a do _DE adresa teto zony _A nyni obsahuje dalsi prikaz ktery ma byt zpracovan
CD 3A 28 A7 20
6E 19 44 5C 19 43
47 7E E6 C0 78 28 0F CF FF
C1
CD 30 25 C8 2A 55 5C 3E C0 A6 C0 AF
FE 01 CE 00 56 23 5E ED 53 45 23 5E 23 56 EB 19 23
* *vyhledani radku po prikazu skoku * call #196E stanoveni adresy radku ld A,(NSPPC) precteni cisla prikazu v radku jr Z,#1BBF radek byl nalezen and A jinak musi byt cislo prikazu 0 jr NZ,#1BEC pokud neni: chyba * ld B,A uschova _A ld A,(HL) precteni MSB cisla radku and #C0 a prezkouseni jeho platnosti ld A,B vraceni hodnoty do _A jr Z,#1BBF ani konec pgmu,ani spatne cislo radku * rst ERROUT hlaseni DEFB #FF 'OK' * *vstup pri prikazu "REM" *pomoci zruseni navratove adresy BRKTST *je zbytek radku ignorovan * pop BC odstraneni BRKTST * *radek je zpracovan,pokud byl nalezen jeho konec * call CHESYN pokud kontrola syntaxe,rovnou ret Z navrat * ld HL,(NXTLIN) ukazatel na dalsi radek ld A,#C0 a test,zda and (HL) je jiz konec pgmu ret NZ ano * xor A ne:cislo prikazu =0 * *tato rutina zapise nove cislo radku do >PPC< *a vyhleda zacatek nasledujiciho radku * cp 1 timto je cislo prikazu z 0 adc 0 nastaveno na 1 ld D,(HL) cislo radku do _DE inc HL ld E,(HL) 5C ld (PPC),DE a zapsano do systemove promenne inc HL delka tohoto radku do _DE ld E,(HL) inc HL ld D,(HL) ex DE,HL zameneny delka a ukazatel do radku add HL,DE _DE ukazuje na prvni prikaz -1 inc HL provadeneho radku _HL na MSB cisla nasledujiciho *
1BD1 1BD1 1BD1 1BD4 1BD5 1BD8 1BD9 1BDB 1BDF 1BE0 1BE3 1BE6 1BE7 1BEA 1BEC 1BEC 1BED 1BEE 1BEE 1BF1 1BF2 1BF3 1BF4 1BF4 1BF4 1BF4 1BF4 1BF4 1BF5 1BF7 1BF9 1BFB 1BFE 1BFE 1C01 1C01 1C01 1C01 1C02 1C03 1C04 1C05 1C06 1C07 1C08 1C09 1C0A 1C0B 1C0C 1C0D 1C0D 1C0D 1C0D 1C10 1C10 1C10 1C10 1C11 1C11 1C11
*nastaveni promennych pro dalsi radek * 22 55 5C ld (NXTLIN),HL zacatek dalsiho radku EB ex DE,HL 22 5D 5C ld (CHADD),HL aktualni prikaz -1 57 ld D,A kopie cisla prikazu 1E 00 ld E,0 FD 36 0A FF ld (NSPPC),#FF pozn: ne skok 15 dec D cislo prikazu -1 FD 72 0D ld (SUBPPC),D zapsano do sysvar CA 28 1B jp Z,#1B28 novy radek:provereni prvniho prikazu 14 inc D korekce cisla prikazu CD 8B 19 call #198B a stanoveni jeho adresy -1 28 08 jr Z,#1BF4 prikaz nalezen * CF rst ERROUT hlaseni 16 DEFB #16 'Statement lost' * CD 30 25 SYNTX call CHESYN kontrola syntaxe ? C0 ret NZ ne:navrat (pri behu pgmu) C1 pop BC ano:zruseni dvou navratovych adres C1 pop BC * *vyhledani dalsiho prikazu *pri 'ENTER' v dalsim radku,pri ':' v aktualnim radku *vsechny ostatni znaky znaci chybu syntaxe * DF rst GETACT precteni aktualniho znaku FE 0D cp #0D konec radku ? 28 BA jr Z,#1BB3 ano:vyhledani dalsiho radku FE 3A cp ':' oddelovaci dvojtecka ? CA 28 1B jp Z,#1B28 ano:ve smycce interpretru na dalsi prikaz C3 8A 1C jp #1C8A jinak chyba 'Nonsense in BASIC' * *tabulka ofsetu pro jednotlive parametry prikazu * 0F DEFB #0F PAR00 #1C10 1D DEFB #1D PAR01 #1C1F 4B DEFB #4B PAR02 #1C4E 09 DEFB #09 PAR03 #1C0D 67 DEFB #67 PAR04 #1C6C 0B DEFB #0B PAR05 #1C11 7B DEFB #7B PAR06 #1C82 8E DEFB #8E PAR07 #1C96 71 DEFB #71 PAR08 #1C7A B4 DEFB #B4 PAR09 #1CBE 81 DEFB #81 PAR0A #1C8C CF DEFB #CF PAR0B #1CDB * *parametr 03:muze nasledovat cislo * CD DE 1C call #1CDE prevzeti cisla, 0 pokud nenalezeno * *parametr 00:nesmi nasledovat udaj (napr. za 'COPY') * BF cp A nastaveni ZERO * *parametr 05:muze nasledovat vyraz (napr.PRINT"ZX") *
1C11 1C12 1C15 1C16 1C16 1C16 1C16 1C16 1C19 1C1A 1C1B 1C1C 1C1D 1C1E 1C1F 1C1F 1C1F 1C1F 1C22 1C26 1C28 1C2C 1C2E 1C2E 1C2F 1C30 1C30 1C33 1C33 1C37 1C39 1C3A 1C3D 1C40 1C43 1C44 1C45 1C46 1C46 1C46 1C46 1C46 1C46 1C46 1C4A 1C4D 1C4E 1C4E 1C4E 1C4E 1C4E 1C4F 1C52 1C55 1C56 1C56 1C56 1C56 1C56 1C56
C1 CC EE 1B EB
zruseni navratove adresy pouze pri PAR00 & 01 kontrola syntaxe ukazatel do radku predan do _DE
2A 74 5C 4E 23 46 EB C5 C9
CD FD 30 FD 20 CF 01
B2 28 36 37 00 08 CB 37 CE 18
CC 96 29 FD 20 AF CD C4 21 B6 77 EB CB 01 76 0D 30 25 F1 2B 71 5C
ED 43 72 5C 22 4D 5C C9
C1 CD 56 1C CD EE 1B C9
3A 3B 5C
* *nyni se muze z tabulky parametru vyzvednout adresa skoku *a ulozit na zasobnik * ld HL,(TADDR) ukazatel do tabulky ld C,(HL) tam ulozena adresa skoku do _BC inc HL ld B,(HL) ex DE,HL ukazatel do radku zpet v _HL push BC ulozeni adresy na zasobnik ret a skok na ni * *parametr 01:prideleni hodnoty promenne pri 'LET' * call #28B2 zjisti,zda je promenna jiz zavedena ld (FLAGX),0 iniciace >FLAGX< jr NC,#1C30 promenna jiz je zrizena set 1,(FLAGX) jinak pozn:zridit jr NZ,#1C46 krome nedim. pole vse zkontrolovano * rst ERROUT hlaseni DEFB #01 'Variable not found' * call Z,#2996 parametr pole/prosteho retezce na zasobnik kalkulatoru bit 6,(FLAGS) numericka promenna ? jr NZ,#1C46 ano:skok xor A nulovani _A call CHESYN kontrola syntaxe ? call NZ,#2BF1 ne:prevzeti parametru retezce/pole ld HL,FLAGX bit0 pri prostem retezci or (HL) nastaven a tim poznaceno,ze ld (HL),A stara hodnota bude odstranena ex DE,HL _HL ukazuje na retez.nebo prvek pole * *pro vsechny numericke a nove retezcove promenne nebo *retezcova pole obsahuje _C jmeno promenne *pro stary retezec nebo retez.pole obsahuje _BC delku pro *prideleni * ld (STRLEN),BC ld (DEST),HL pro prideleni ret * *parametr 02:provedeni aktualniho prepoctu pro prideleni *hodnoty promenne prikazem 'LET' * pop BC zruseni navratove adresy call #1C56 probehne prideleni hodnoty call SYNTX pri behu pgmu na dalsi prikaz ret * *tuto rutinu vyuziva 'LET','READ' a 'INPUT' *nejprve spocita hodnotu vyrazu a tu potom prideli promenne *'INPUT' pouziva >FLAGS< pri vicenasobnem prikazu * ld A,(FLAGS)
1C59 1C5A 1C5D 1C5E 1C61 1C62 1C64 1C66 1C68 1C6B 1C6C 1C6C 1C6C 1C6C 1C6F 1C70 1C71 1C73 1C74 1C76 1C77 1C79 1C79 1C79 1C79 1C79 1C79 1C79 1C7A 1C7D 1C7F 1C81 1C82 1C82 1C82 1C82 1C85 1C89 1C8A 1C8A 1C8B 1C8C 1C8C 1C8C 1C8C 1C8F 1C93 1C94 1C96 1C96 1C96 1C96 1C9A 1C9E 1CA1 1CA2 1CA5 1CA7 1CAA 1CAD
F5 CD F1 FD AA E6 20 CB C2 C9
FB 24 56 01 40 24 7A FF 2A
uschova >FLAGS< nebo >FLAGX< vyhodnoceny vyraz na calcstack obnoveni >FLAGS< / >FLAGX< nove precteni >FLAGS< vyraz a jeho druh musi souhlasit jinak chyba 'Nonsense...' pri behu pgmu probehne prideleni hodnoty pri kontrole syntaxe navrat
CD F5 79 F6 3C 20 F1 18
B2 28 9F 14 A9
E7 CD 82 1C FE 2C 20 09 E7
CD FB 24 FD CB 01 76 C0 CF 0B
CD FB 24 FD CB 01 76 C8 18 F4
FD FD C4 F1 3A D6 CD CD 2A
CB 01 7E CB 02 86 4D 0D 74 13 FC EE 8F 5C 21 1B 5C
* *parametr 04:vstup pro prikaz 'FOR'-'NEXT' * call #28B2 hledani pouzite promenne push AF uschova _F (stavovy registr) ld A,C kontrola,zda nalezena promenna or #9F byla definovana jako promenna inc A "FOR-NEXT" jr NZ,#1C8A ne:chyba 'Nonsense in BASIC' pop AF jinak obnoveni _F jr #1C22 a prideleni hodnoty je pripraveno * *rutina slouzi k vypoctu numerickeho vyrazu *platny vysledek je predan na zasobnik kalkulatoru (calcstack) * *parametr 08:dva vyrazy oddelene carkou * rst GETNXT >CHADD< +1,precten dalsi znak call #1C82 vypocet prvniho vyrazu cp ',' kdyz nenasleduje oddelovaci carka jr NZ,#1C8A pak chyba 'Nonsense...' rst GETNXT jinak dalsi znak * *parametr 06:vypocet jednoho vyrazu * call SCANN vypocet nasledujiciho vyrazu bit 6,(FLAGS) pokud je vysledek numericky ret NZ pak navrat,jinak * rst ERROUT hlaseni DEFB #0B 'Nonsense in BASIC' * *parametr 0A:vypocet prosteho retezcoveho vyrazu * call SCANN spocita nasledujici vyraz bit 6,(FLAGS) nulovy bit6 >FLAGS< znaci retezec ret Z jr #1C8A jinak chyba * *parametr 07:nastaveni stalych barev * bit 7,(FLAGS) test syntaxe/beh pgmu res 0,(TVFLAG) pozn:hlavni dil obrazovky call NZ,ACTCOL volano pri behu pgmu pop AF odstraneni navratove adresy ld A,(TADDR) LSB >TADDR< precten a sub #13 upraven na #D9..#DE tj. 'INK'..'OVER' call #21FC nastaveni okamzite barvy call SYNTX pri kontrole syntaxe na dalsi prikaz ld HL,(ATTRT) jinak se barvy nastavi
1CB0 1CB3 1CB6 1CB7 1CB8 1CB9 1CBB 1CBC 1CBD 1CBE 1CBE 1CBE 1CBE 1CBE 1CC1 1CC3 1CC7 1CCA 1CCD 1CCE 1CD0 1CD1 1CD5 1CD6 1CD9 1CDB 1CDB 1CDB 1CDB 1CDE 1CDE 1CDE 1CDE 1CDE 1CE0 1CE2 1CE4 1CE6 1CE6 1CE6 1CE6 1CE9 1CEA 1CEB 1CEC 1CED 1CEE 1CEE 1CEE 1CEE 1CEF 1CF0 1CF0 1CF0 1CF0 1CF1 1CF4 1CF6 1CF7 1CF8
22 8D 5C 21 91 5C 7E 07 AE E6 AA AE 77 C9
trvale sude bity se prekopiruji do lichych takze okamzite barvy rovnez trvale
* *parametr 09:tuto rutinu vyuziva 'PLOT','DRAW' a 'CIRCLE' *nejprve se nastavi hodnoty FLASH,BRIGHT a PAPER na 8 * CD 30 25 call CHESYN pokud jen kontrola syntaxe 28 13 jr Z,#1CD6 pak skok FD CB 02 86 res 0,(TVFLAG) pozn:hlavni dil obrazovky CD 4D 0D call ACTCOL nastaveni okamzitych barev 21 90 5C ld HL,MASKT 7E ld A,(HL) z >MASKT< prevzata pouze hodnota INK F6 F8 or #F8 FLASH,BRIGHT a PAPER jsou 8 77 ld (HL),A FD CB 57 B6 res 6,(PFLAG) nemuze byt PAPER 9 DF rst GETACT znovu posledni znak CD E2 21 call ONECOL prepracuje lokalni,dominantni barvy 18 9F jr #1C7A na zpracovani prvniho z dvojice oper. * *parametr 0B:vsechny rutiny pro praci s magnetofonem * C3 05 06 jp CCMAIN * *rutina pro vypocet numerickeho vyrazu *pokud neni k dispozici vyraz, vyda 0 * FE 0D cp #0D konec radku ? 28 04 jr Z,#1CE6 ano FE 3A cp ':' oddelovaci dvojtecka ? 20 9C jr NZ,#1C82 ne * *pouzije tedy kalkulator a na jeho zasobnik polozi 0 * CD 30 25 call CHESYN pokud kontrola syntaxe,nic nepocita C8 ret Z a navrat EF rst CALSW volani kalkulatoru A0 DEFB #A0 0 na zasobnik kalk. 38 DEFB #38 navrat z kalk. C9 ret * *prikaz 'STOP' * CF rst ERROUT pouze hlaseni 08 DEFB #08 'STOP statement' * *prikaz 'IF' * C1 pop BC odstraneni navratove adresy #1B76 CD 30 25 call CHESYN kontrola syntaxe ? 28 0A jr Z,#1D00 ano:skok EF rst CALSW volani kalkulatoru 02 DEFB #02 vymaze posledni polozku 38 DEFB #38
1CF9 1CFA 1CFD 1D00 1D00 1D03 1D03 1D03 1D03 1D05 1D07 1D08 1D0B 1D0E 1D10 1D10 1D13 1D14 1D15 1D16 1D16 1D16 1D16 1D16 1D17 1D18 1D19 1D1A 1D1B 1D1C 1D1D 1D1D 1D20 1D20 1D23 1D24 1D25 1D27 1D2A 1D2B 1D2C 1D2E 1D30 1D33 1D34 1D35 1D36 1D37 1D38 1D39 1D3A 1D3B 1D3D 1D3F 1D42 1D43 1D44 1D45 1D46 1D49
EB CD E9 34 DA B3 1B C3 29 1B
FE 20 E7 CD CD 18
CD 09 82 1C EE 1B 06
CD EE 1B EF A1 38
EF C0 02 01 E0 01 38 CD FF 2A 22 2B 7E CB 01 09 07 38 0E CD 23 E5 EF 02 02 38 E1 EB 0E ED 2A EB 73 23 72 FD 14 68 5C FE 06 00 06 0D 55 16
0A B0 45 5C
56 0D
jp #1B29 * *prikaz 'FOR' * cp #CD je udan krok ('STEP') ? jr NZ,#1D10 ne rst GETNXT jinak >CHADD< na dalsi znak call #1C82 zjisti hodnotu kroku call SYNTX pri ko.syntaxe k dalsimu prikazu jr #1D16 jinak volani kalkulatoru * call SYNTX pri ko.syntaxe na dalsi prikaz rst CALSW jinak volan kalkulator DEFB #A1 implicitne krok 1 ;1->stack DEFB #38 navrat z kalk. * *posledni tri hodnoty na zasobniku kalkulatoru jsou *hodnota promenne (P),horni hranice (H) a krok (K) * rst CALSW volan kalkulator DEFB #C0 P H K ;K->mem0 DEFB #02 P H ;drop DEFB #01 H P ;swap DEFB #E0 H P K ;mem0->stack DEFB #01 H K P ;swap DEFB #38 navrat z kalk. * call #2AFF vyhledani promenne (P) nebo jeji zrizeni ld (MEM),HL pro vytvoreni prostoru dec HL ukazuje na jmeno promenne ld A,(HL) precteni jmena set 7,(HL) pozn:"promenna FOR" ld BC,6 jednoducha promenna zabere 6 bajtu add HL,BC ty jsou preskoceny rlca byla to jiz promenna FOR ? jr C,#1D34 ano ld C,#0D jinak je zapotrebi dalsich 13 bajtu call MAKESP ty jsou vyhrazeny inc HL _HL ukazuje na "horni hranici" push HL a je uschovano rst CALSW H K DEFB #02 H ;drop (odstranen krok) DEFB #02 ;drop (odstr.hranice cyklu) DEFB #38 navrat z kalk. (_DE ukazuje na "H") pop HL obnoveni ukazatele _HL ex DE,HL zamena pro presun hodnot ld C,10 10 bajtu pro "H" a "K" ldir preneseno ld HL,(PPC) aktualni cislo radku pgmu ex DE,HL zamena cisla radku a ukazatele ld (HL),E zapsani cisla radku,na nemz je 'FOR' inc HL ld (HL),D ld D,(SUBPPC) a pote za nej inc D jeste cislo prikazu za 'FOR'
_HL ukazuje na posledni hodnotu test na 0 hodnota za IF nepravdiva:radek je hotov,pgm pokracuje na dalsim jinak dalsi prikaz za 'THEN'
1D4A 1D4B 1D4C 1D4C 1D4C 1D4C 1D4C 1D4F 1D50 1D50 1D53 1D56 1D59 1D5C 1D5E 1D5F 1D62 1D64 1D65 1D69 1D6C 1D70 1D71 1D73 1D74 1D76 1D77 1D79 1D7A 1D7C 1D7C 1D7C 1D7C 1D7C 1D7D 1D7F 1D80 1D83 1D84 1D84 1D85 1D86 1D86 1D86 1D86 1D86 1D87 1D89 1D8B 1D8C 1D8D 1D8F 1D90 1D91 1D91 1D92 1D93 1D94 1D98 1D99
23 72
inc HL ld (HL),D
* *nasleduje test,zda smycka 'FOR'-'NEXT' vubec probehne *ano:navrat, ne:musi byt nalezen prikaz za 'NEXT' * CD DA 1D call #1DDA dosazeno horni hranice smycky ? D0 ret NC ne * FD 46 38 ld B,(STRLEN) precteno jmeno promenne 2A 45 5C ld HL,(PPC) aktualni cislo radku 22 42 5C ld (NEWPPC),HL prepsano do "noveho" 3A 47 5C ld A,(SUBPPC) k cislu prikazu v radku ED 44 neg vytvorena zaporna hodnota 57 ld D,A a prenesena do _D 2A 5D 5C ld HL,(CHADD) aktualni hodnota >CHADD< prectena 1E F3 ld E,#F3 bude hledan token 'NEXT' C5 push BC jmeno promenne uschovano ED 4B 55 5C ld BC,(NXTLIN) aktualni hodnota dalsiho radku CD 86 1D call #1D86 nyni hledani 'NEXT' v pgmu ED 43 55 5C ld (NXTLIN),BC nova hodnota "dalsi radek" C1 pop BC vraceni jmena promenne 38 11 jr C,#1D84 zadne 'NEXT' nenalezeno:chyba E7 rst GETNXT dalsi znak po 'NEXT' tzn. jmeno F6 20 or #20 vzdy velke pismeno B8 cp B a porovnana obe jmena 28 03 jr Z,#1D7C souhlasi E7 rst GETNXT jinak dalsi znak 18 E8 jr #1D64 a pokracuje hledani * *>NEWPPC< obsahuje cislo radku,ve kterem bylo nalezeno *spravne 'NEXT'. Cislo prikazu bude zapsano do >NSPPC< * E7 rst GETNXT >CHADD< +1 3E 01 ld A,1 zde je zpetne zapsan _D 92 sub D jeho hodnota musi byt odectena 32 44 5C ld (NSPPC),A od 1 pro zapis do >NSPPC< C9 ret * CF rst ERROUT hlaseni 11 DEFB #11 'FOR without NEXT' * *tato rutina vyhledava v pgmu 'DATA','DEF FN' a 'NEXT' *hledany token v _E, pocatecni adresa hledani v _HL * 7E ld A,(HL) aktualni znak FE 3A cp ':' dalsi prikaz v radku ? 28 18 jr Z,#1DA3 ano 23 inc HL _HL ukazuje na MSB cisla dalsiho 7E ld A,(HL) radku. jeho hodnota ke kontrole E6 C0 and #C0 konec pgmu ? 37 scf (pro konec pgmu nastaveno CARRY) C0 ret NZ pokud konec:navrat * 46 ld B,(HL) precteni cisla 23 inc HL dalsiho radku 4E ld C,(HL) ED 43 42 5C ld (NEWPPC),BC a jeho zapis do systemove promenne 23 inc HL precteni delky radku 4E ld C,(HL)
1D9A 1D9B 1D9C 1D9D 1D9E 1D9F 1DA0 1DA1 1DA3 1DA4 1DA7 1DA8 1DA9 1DAB 1DAB 1DAB 1DAB 1DAB 1DAF 1DB2 1DB5 1DB7 1DB9 1DBA 1DBD 1DBE 1DBF 1DC0 1DC1 1DC2 1DC3 1DC4 1DC4 1DC7 1DC7 1DC8 1DCB 1DCE 1DCF 1DD0 1DD1 1DD2 1DD3 1DD4 1DD5 1DD8 1DD8 1DD9 1DDA 1DDA 1DDA 1DDA 1DDA 1DDB 1DDC 1DDD 1DDE 1DDF 1DE1 1DE2
23 46 E5 09 44 4D E1 16 00 C5 CD 8B 19 C1 D0 18 E0
ukazatel uschovan konec aktualniho radku vypocten a predan do _BC (dalsi radek -1) obnoven ukazatel pocitadlo prikazu vynulovano konec radku ulozen prohledany prikazy radku obnoveni konce radku v _BC navrat,pokud nalezeno jinak prohledavan dalsi radek
* *prikaz 'NEXT' *promenna cyklu bude zvysena o hodnotu kroku * FD CB 37 4E bit 1,(FLAGX) promenna nalezena ? C2 2E 1C jp NZ,#1C2E ne:chyba 2A 4D 5C ld HL,(DEST) adresa promenne CB 7E bit 7,(HL) test jmena 28 1F jr Z,#1DD8 chyba 'NEXT without FOR' 23 inc HL 22 68 5C ld (MEM),HL pamet kalkulatoru na adresu promenne EF rst CALSW volani kalkulatoru E0 DEFB #E0 P ;mem0->stack E2 DEFB #E2 P K ;mem2->stack 0F DEFB #0F P+K ;add (pricte krok) C0 DEFB #C0 P+K ;P+K->mem0 02 DEFB #02 ;drop 38 DEFB #38 * CD DA 1D call #1DDA porovnani okamzite a koncove hodnoty parametru cyklu D8 ret C dosazeno konce:navrat 2A 68 5C ld HL,(MEM) LSB adresy cisla radku 11 0F 00 ld DE,#000F kde zacina smycka 19 add HL,DE spocitan 5E ld E,(HL) toto cislo radku 23 inc HL ulozeno do _DE 56 ld D,(HL) 23 inc HL 66 ld H,(HL) cislo prikazu v radku EB ex DE,HL zamena,aby mohlo probehnout GO TO C3 73 1E jp #1E73 * CF rst ERROUT hlaseni 00 DEFB #00 'NEXT without FOR' * *prezkouseni,zda bylo dosazeno horni/spodni hranice smycky *(podle znamenka hodnoty kroku) * EF rst CALSW volan kalkulator E1 DEFB #E1 H ;mem1->stack E0 DEFB #E0 H P ;mem0->stack E2 DEFB #E2 H P K ;mem2->stack 36 DEFB #36 H P K<0 ;<0? 00 02 DEFB #00 #02 H P ;jr t,NXTNEG 01 DEFB #01 P H ;swap 03 NXTNEG DEFB #03 P-H neb H-P ;sub
1DE3 1DE4 1DE6 1DE7 1DE8 1DE9 1DE9 1DEA 1DEB 1DEC 1DEC 1DEC 1DEC 1DEC 1DEC 1DEC 1DED 1DF0 1DF3 1DF5 1DF6 1DF9 1DFC 1DFD 1DFF 1E01 1E03 1E06 1E08 1E08 1E09 1E0A 1E0A 1E0D 1E10 1E11 1E14 1E17 1E1B 1E1E 1E1F 1E21 1E23 1E26 1E27 1E27 1E27 1E27 1E27 1E2A 1E2C 1E2F 1E31 1E34 1E35 1E37 1E37 1E39 1E39 1E39
37 00 04 38 A7 C9 38 37 C9
* NXTEND DEFB #38 navrat z kalk. scf CARRY =1: konec smycky 'FOR'-'NEXT' ret * *prikaz 'READ' *>CHADD< je pouzito jako ukazovatko na prikazy 'DATA' *>DATADD< ukazuje na aktualni prvek dat *(nutne pro nekolikanasobny prikaz 'READ') * E7 rst GETNXT >CHADD< +1,dalsi znak CD 1F 1C call #1C1F zjisti,zda promenna je zavedena CD 30 25 call CHESYN kontrola syntaxe ? 28 29 jr Z,#1E1E ano:skok DF rst GETACT znovu hodnota >CHADD< 22 5F 5C ld (XPTR),HL pro zapsani 2A 57 5C ld HL,(DATADD) ukazatel na aktualni prvek 7E ld A,(HL) pokud carka jako oddelovaci znak FE 2C cp ',' 28 09 jr Z,#1E0A pokracuje 1E E4 ld E,#E4 jinak prikaz 'DATA' CD 86 1D call #1D86 musi byt nalezen dale 30 02 jr NC,#1E0A byl nalezen:skok,jinak * CF rst ERROUT hlaseni 0D DEFB #0D 'Out of DATA' * CD 77 00 call #0077 >CHADD< +1 CD 56 1C call #1C56 hodnota zjistena a pridelena promenne DF rst GETACT aktualni hodnota >CHADD< do _HL 22 57 5C ld (DATADD),HL k zapsani 2A 5F 5C ld HL,(XPTR) precten ukazatel na 'READ' FD 36 26 00 ld (IY+#26),0 nulovan MSB >XPTR< CD 78 00 call #0078 _HL zapsano do >CHADD< DF rst GETACT aktualni znak FE 2C cp ',' je carka ? 28 C9 jr Z,#1DEC ano:dalsi nacitani dat CD EE 1B call SYNTX pri kontrole syntaxe jeji konec C9 ret pri behu pgmu navrat * *prikaz 'DATA' *pri behu pgmu jsou prikazy 'DATA' preskoceny * CD 30 25 call CHESYN beh pgmu ? 20 0B jr NZ,#1E37 ano CD FB 24 call SCANN vyhodnocen vyraz FE 2C cp ',' oddelovac ? C4 EE 1B call NZ,SYNTX ne:test konce E7 rst GETNXT >CHADD< +1 18 F5 jr #1E2C a dale ve smycce * 3E E4 ld A,#E4 pro preskoceni prikazu 'DATA' * *rutina pro preskoceni casti pgmu *
1E39 1E3A 1E3C 1E3F 1E42 1E42 1E42 1E42 1E42 1E42 1E45 1E46 1E47 1E4A 1E4B 1E4E 1E4F 1E4F 1E4F 1E4F 1E4F 1E52 1E53 1E54 1E56 1E5A 1E5E 1E5F 1E5F 1E5F 1E5F 1E5F 1E5F 1E62 1E65 1E67 1E67 1E67 1E67 1E67 1E67 1E6A 1E6B 1E6C 1E6E 1E6F 1E71 1E73 1E73 1E76 1E79 1E7A 1E7A 1E7A 1E7A 1E7A 1E7D 1E7F 1E80 1E80
47 ED B9 11 00 02 C3 8B 19
do _BC vlozen kod tokenu (>127) je vyhledan od druheho znaku za nim hledani dalsiho prikazu
* *prikaz 'RESTORE' *jeho operandem je cislo radku *pokud neni predepsano,implicitne dosazena 0 * CD 99 1E call INTEG2 cislo radku do _BC 60 ld H,B a kopie do _HL 69 ld L,C CD 6E 19 call #196E vyhledani adresy radku 2B dec HL tato snizena o 1 22 57 5C ld (DATADD),HL a zapsana C9 ret * *prikaz 'RANDOMIZE' *pokud je operand 0,je pouzit obsah >FRAMES< * CD 99 1E call INTEG2 hodnota do _BC 78 ld A,B a testovana na 0 B1 or C 20 04 jr NZ,#1E5A pokud nenulova ED 4B 78 5C ld BC,(FRAMES) jinak >FRAMES< ED 43 76 5C ld (SEED),BC prepsano do >SEED< C9 ret * *prikaz 'CONTINUE' *je zjisteno odpovidajici cislo radku a prikazu *a potom provedeno 'GO TO' * 2A 6E 5C ld HL,(OLDPPC) cislo radku FD 56 36 ld D,(OSPCC) cislo prikazu v radku 18 0C jr #1E73 * *prikaz 'GO TO' *cislo radku muze byt v rozmezi 0..9999 *staci ho testovat na > 61439 * CD 99 1E call INTEG2 argument (cislo radku) do _BC 60 ld H,B a kopie do _HL 69 ld L,C 16 00 ld D,0 cislo prikazu je 0 7C ld A,H FE F0 cp #F0 test > 61439 ? 30 2C jr NC,#1E9F ano:chyba * 22 42 5C ld (NEWPPC),HL jinak cislo radku zapsano FD 72 0A ld (NSPPC),D taktez cislo prikazu C9 ret * *prikaz 'OUT' *dva parametry jsou prevzaty ze zasobniku kalkulatoru * CD 85 1E call #1E85 prevezme hodnoty parametru ED 79 out (C),A posle _A na port _C C9 ret * *prikaz 'POKE'
1E80 1E80 1E83 1E84 1E85 1E85 1E85 1E85 1E85 1E85 1E88 1E8A 1E8C 1E8E 1E8F 1E92 1E93 1E94 1E94 1E94 1E94 1E94 1E94 1E97 1E99 1E9C 1E9E 1E9F 1E9F 1EA0 1EA1 1EA1 1EA1 1EA1 1EA1 1EA4 1EA7 1EAA 1EAC 1EAC 1EAC 1EAC 1EAC 1EAF 1EB0 1EB1 1EB3 1EB7 1EB8 1EBC 1EBF 1EC0 1EC3 1EC6 1EC9 1ECC 1ECD 1ECE 1ED0 1ED2
* *prevzeti dvou hodnot ze zasobniku kalkulatoru *prvni musi byt 0..255 (pokud je zaporna,zmenena na kladnou) *druha 0..65535 (celociselna) * CD D5 2D call #2DD5 prevezme prvni parametr 38 15 jr C,#1E9F je-li mimo rozsah:chyba 28 02 jr Z,#1E8E je kladny:skok ED 44 neg jinak vytvoreni doplnku F5 push AF a jeho uschova CD 99 1E call INTEG2 druhy parametr do _BC F1 pop AF obnoveni prvniho C9 ret * *podpgm k prevzeti cisla (integer) ze zasobniku kalkulatoru *INTEG1 pro 0..255 (1 bajtove) *INTEG2 pro 0..65535 (2 bajtove) * CD D5 2D INTEG1 call #2DD5 posledni hodnota z calcstacku do _A 18 03 jr #1E9C CD A2 2D INTEG2 call #2DA2 posledni hodnota z calcstacku do _BC 38 01 jr C,#1E9F cislo prilis velke C8 ret Z pri kladnem cisle v urcenych mezich * CF rst ERROUT hlaseni 0A DEFB #0A 'Integer out of range' * *prikaz 'RUN' *probehne 'RESTORE 0', 'CLEAR' a 'GO TO' s parametrem z 'RUN' * CD 67 1E call #1E67 pomoci rutiny GOTO nastaveno >NEWPPC< 01 00 00 ld BC,0 RESTORE 0 CD 45 1E call #1E45 probehne 18 03 jr #1EAF a na prikaz 'CLEAR' * *prikaz 'CLEAR' *maze obraz a promenne,nastavuje >RAMTOP< a zasobnik * CD 99 1E call INTEG2 hodnota do _BC 78 ld A,B a testovana na 0 B1 or C 20 04 jr NZ,#1EB7 kdyz nenulova ED 4B B2 5C ld BC,(RAMTOP) pokud =0,pak puvodni >RAMTOP< C5 push BC uschovan ED 5B 4B 5C ld DE,(VARS) usek pameti pro BASIC promenne 2A 59 5C ld HL,(ELINE) 2B dec HL CD E5 19 call OUT1 je uvolnen CD 6B 0D call #0D6B smazani obrazovky 2A 65 5C ld HL,(STKEND) soucasna hodnota poc.volneho prostoru 11 32 00 ld DE,50 50 bajtu navic (rezerva) 19 add HL,DE pricte pro test D1 pop DE >STKEND< nebo #0000 ED 52 sbc HL,DE test,zda by byla hranice moc nizko 30 08 jr NC,#1EDA ano:chyba 2A B4 5C ld HL,(PRAMT) pro test horni hranice
1ED5 1ED6 1ED8 1EDA 1EDA 1EDB 1EDC 1EDC 1EDD 1EE0 1EE1 1EE2 1EE4 1EE5 1EE6 1EE7 1EEB 1EEC 1EED 1EED 1EED 1EED 1EED 1EEE 1EF1 1EF2 1EF3 1EF4 1EF8 1EF9 1EFA 1EFE 1EFF 1F02 1F05 1F05 1F05 1F05 1F05 1F05 1F08 1F09 1F0B 1F0C 1F0F 1F10 1F12 1F14 1F15 1F15 1F15 1F15 1F17 1F1A 1F1A 1F1A 1F1A 1F1A 1F1D 1F20
A7 ED 52 30 02 * CF 15 * EB 22 B2 5C D1 C1 36 3E 2B F9 C5 ED 73 3D 5C EB E9
and A sbc HL,DE jr NC,#1EDC rst ERROUT DEFB #15 ex ld pop pop ld dec ld push ld ex jp DE,HL (RAMTOP),HL DE BC (HL),#3E HL SP,HL BC (ERRSP),SP DE,HL (HL)
nulovani CARRY a odecteni vse v poradku hlaseni 'RAMTOP no good' zamena,aby mohl byt nove nastaven >RAMTOP< navratova adresa BRKTST chybova navratova adresa koncova znacka "GOSUB" na zasobnik a o bajt nize bude normalni zasobnik na nej hned chybova navrat.adresa a zapsani _SP navratova adresa BRKTST do _HL a skok na ni
* *prikaz 'GO SUB' *ulozi na zasobnik aktualni hodnoty >PPC< a >SUBPPC< +1 * D1 pop DE navratova adresa BRKTST FD 66 0D ld H,(SUBPPC) precteni cisla prikazu 24 inc H +1 pro pokracovani za timto prikazem E3 ex (SP),HL zamena chybove adr. s cislem prikazu 33 inc SP LSB zase uvolnen ED 4B 45 5C ld BC,(PPC) cislo aktualniho radku C5 push BC zpet na zasobnik E5 push HL na nej jeste chybova adresa ED 73 3D 5C ld (ERRSP),SP nastaven citac chyboveho zasobniku D5 push DE jeste navratova adresa BRKTST CD 67 1E call #1E67 nove nastaveni >NEWPPC< & >NSPPC< 01 14 00 ld BC,20 pred provedenim 'GO SUB' probehne jeste jeden test velikosti pameti * *testovaci rutina pro potrebny pametovy prostor *v _BC pocet bajtu * 2A 65 5C ld HL,(STKEND) ke >STKEND< 09 add HL,BC pricteno potrebne misto v pameti 38 0A jr C,#1F15 vysledek >#FFFF: chyba EB ex DE,HL testovano dale 21 50 00 ld HL,#0050 s pripoctenim dalsich 80 bajtu 19 add HL,DE 38 03 jr C,#1F15 opet kdyz >#FFFF:chyba ED 72 sbc HL,SP porovnani s citacem zasobniku D8 ret C potrebne misto je k dispozici * *chybove hlaseni 'Out of memory' * 2E 03 ld L,3 aby mohla pokracovat cinnost C3 55 00 jp #0055 hlaseni neni pomoci ERROUT * *rutina k vypoctu velikosti volne pameti *mozno pouzit pomoci "PRINT 65535 - USR 7962" * 01 00 00 ld BC,0 test velikosti bez pridanych bajtu CD 05 1F call #1F05 44 ld B,H vysledek do _BC
1F21 1F22 1F23 1F23 1F23 1F23 1F23 1F24 1F25 1F26 1F27 1F29 1F2B 1F2C 1F2D 1F2D 1F2E 1F32 1F33 1F36 1F36 1F37 1F38 1F39 1F3A 1F3A 1F3A 1F3A 1F3A 1F3A 1F3D 1F3E 1F3F 1F40 1F41 1F43 1F44 1F45 1F46 1F48 1F49 1F4D 1F4F 1F4F 1F53 1F54 1F54 1F54 1F54 1F56 1F58 1F59 1F5A 1F5C 1F5E 1F5F 1F60 1F60 1F60 1F60
4D C9
ld C,L ret
* *prikaz 'RETURN' *cislo radku a prikazu prevezme ze zasobniku GOSUB * C1 pop BC navratova adresa BRKTST E1 pop HL chybova navratova adresa D1 pop DE posledni zaznam na zasobniku GOSUB 7A ld A,D FE 3E cp #3E testovan na koncovou znacku 28 0B jr Z,#1F36 pokud shoda:chyba 'RETURN...' 3B dec SP nove nastaveni citace zasobniku E3 ex (SP),HL vymena cisla prikazu a chybove navratove adresy EB ex DE,HL cislo prikazu do _D ED 73 3D 5C ld (ERRSP),SP normalni stav citace chyb.zasobniku C5 push BC vraceni navratove adresy BRKTST C3 73 1E jp #1E73 a nove nastaveni >NEWPPC< a >NSPPC< * D5 push DE koncova znacka E5 push HL a chybova adresa zpet CF rst ERROUT hlaseni 06 DEFB #06 'RETURN without GOSUB' * *prikaz 'PAUSE' *odpocitavani se provadi pri testu klavesnice *pokud stlaceni klavesy, pak 'PAUSE' vzdy preruseno * CD 99 1E call INTEG2 ciselna hodnota do _BC 76 halt cekani na dalsi interrupt 0B dec BC pocitadlo -1 78 ld A,B odpocitano do 0 ? B1 or C 28 0C jr Z,#1F4F ano 78 ld A,B pokud bylo _BC=0 jiz pred "dec", A1 and C je nyni #FFFF 3C inc A to je testovano 20 01 jr NZ,#1F49 _BC nebylo nulove 03 inc BC jinak znovu vraceno na 0 FD CB 01 6E bit 5,(FLAGS) a cekani ve smycce na stisk klavesy 28 EE jr Z,#1F3D zatim nestisknuta * FD CB 01 AE res 5,(FLAGS) pozn:klavesa nestlacena C9 ret a hotovo * *podpgm pro kontrolu stlaceni 'BREAK' * 3E 7F ld A,#7F vytvoreni adresy portu !!! DB FE in A,(#FE) precteni portu 1F rra bit0 do CARRY D8 ret C navrat,kdyz nestlaceno 'SPACE' 3E FE ld A,#FE jinak adresa portu pro "CAPS" DB FE in A,(#FE) a precteni portu 1F rra CARRY =0,pokud byly stlaceny obe C9 ret klavesy,jinak nastaveno * *prikaz 'DEF FN' *pri behu pgmu bude prikaz preskocen *pri kontrole syntaxe je zkontrolovan vyraz
1F60 1F60 1F63 1F65 1F67 1F6A 1F6A 1F6E 1F71 1F73 1F74 1F76 1F78 1F7C 1F7D 1F7F 1F81 1F82 1F84 1F86 1F86 1F86 1F86 1F89 1F8C 1F8D 1F8E 1F90 1F92 1F93 1F94 1F95 1F98 1F9B 1F9C 1F9D 1F9F 1FA1 1FA3 1FA4 1FA6 1FA6 1FA8 1FAA 1FAB 1FAD 1FAF 1FB0 1FB3 1FB4 1FB7 1FB8 1FBB 1FBD 1FC0 1FC3 1FC3 1FC3 1FC3 1FC3
* CD 28 3E C3 FD CD 30 E7 FE 20 FD E7 FE 20 E7 FE 28 30 25 05 CE 39 1E * CB 01 F6 8D 2C 16 24 05 CB 01 B6 28 3C 29 20 set call jr rst cp jr res rst cp jr rst cp jr 6,(FLAGS) #2C8D NC,#1F89 GETNXT '$' NZ,#1F7D 6,(FLAGS) GETNXT '(' NZ,#1FBD GETNXT ')' Z,#1FA6 pozn:numericka promenna je aktualni znak pismeno ? ne jinak dalsi znak oznaceni retezce ? ne ano:retezcova promenna >CHADD< +1, dalsi znak otviraci zavorka ? ne:chyba dalsi znak uzav.zavorka (tzn.bez parametru) ? ano call jr ld jp CHESYN Z,#1F6A A,#CE #1E39 kontrola syntaxe ? ano token 'DEF FN' a preskoceni prikazu
CD D2 EB E7 FE 20 EB E7 EB 01 CD 23 23 36 FE 20 E7 18 FE 20 E7 FE 20 E7 3A F5 CD F1 FD E6 C2 CD
8D 2C 8A 1C 24 02
06 00 55 16 0E 2C 03 E0 29 13 3D 0E 3B 5C FB 24 AE 01 40 8A 1C EE 1B
CD 30 25
* *smycka k postupnemu zpracovani vsech parametru * call #2C8D aktualni znak je pismeno ? jp NC,#1C8A ne:chyba ex DE,HL _HL uschovano do _DE rst GETNXT dalsi znak cp '$' dolar ? jr NZ,#1F94 ne ex DE,HL ano:novejsi _HL ulozeno do _DE rst GETNXT dalsi znak ex DE,HL ukazatel na posledni jmeno v _HL ld BC,6 6 bajtu pameti call MAKESP za jmenem vyhrazeno inc HL na prvni volnou pozici inc HL za jmenem ld (HL),#0E zapsan kod "number" cp ',' pokud aktualni znak neni carka, jr NZ,#1FA6 pak opusteni smycky rst GETNXT jinak mohou byt zpracovany jr #1F86 dalsi parametry * cp ')' uzaviraci zavorka musi existovat jr NZ,#1FBD kdyz ne:chyba rst GETNXT dalsi znak cp '=' musi byt rovnitko jr NZ,#1FBD kdyz ne:chyba rst GETNXT posun >CHADD< ld A,(FLAGS) druh funkce push AF uschovan call SCANN definice zpracovana jako vyraz pop AF obnoven druh funkce xor (FLAGS) a s vysledkem vyrazu and #40 porovnan jp NZ,#1C8A pokud druh nesouhlasi:chyba call SYNTX navrat pres test konce * *rutina pro korekci zasobniku pro rozmanite pripady *behem kontroly syntaxe * call CHESYN kontrola syntaxe ?
1FC6 1FC7 1FC8 1FC9 1FC9 1FC9 1FC9 1FC9 1FCB 1FCD 1FCF 1FD2 1FD5 1FD8 1FDB 1FDE 1FDF 1FDF 1FE0 1FE3 1FE5 1FE8 1FEA 1FED 1FF0 1FF2 1FF4 1FF5 1FF5 1FF5 1FF5 1FF5 1FF8 1FFA 1FFB 1FFC 1FFC 1FFC 1FFC 1FFD 1FFF 2001 2004 2007 200A 200C 200E 200E 2010 2012 2013 2016 2019 201C 201E 201F 2020 2021 2022 2023
E1 C8 E9
navratova adresa ze zasobniku navrat pri kontrole syntaxe pri behu pgmu neprimo adres.skokem
3E 18 3E CD C4 CD CD CD C9 DF CD 28 CD 28 CD CD 28 FE C8
03 02 02 30 01 4D DF EE
25 16 0D 1F 1B
45 0D 4E FB FC 4E F3 29
20 20 1F 20
CD C3 1F 3E 0D D7 C9
DF FE 20 CD CD CD 3E 18 FE 20 E7 CD CD CD 3E D7 79 D7 78 D7 C9
AC 0D 79 1C C3 1F 07 23 16 10 AD 12 82 1C C3 1F 99 1E 17
* *prikaz 'LPRINT' a 'PRINT' *je otevren potrebny kanal * ld A,3 otevreni kanalu -Pjr #1FCF ld A,2 otevreni kanalu -Scall CHESYN kontrola syntaxe ? call NZ,OPCAN ne: provede otevreni kanalu call ACTCOL nastaveny soucasne barvy call #1FDF hlavni rutina PRINT call SYNTX test konce ret * rst GETACT precte prvni znak call #2045 konec PRINToveho vyrazu ? jr Z,#1FF2 ano:skok call #204E nejaky znak pro zmenu pozice ? jr Z,#1FE5 ano call #1FFC zpracovani jednotlivych PRINT vyrazu call #204E znak konce/zmeny pozice ? jr Z,#1FE5 ano:dalsi vyraz cp ')' pokud uzaviraci zavorka, ret Z pak navrat * *podpgm pro provedeni navratu vozu ('ENTER') *probehne pouze pri vykonu pgmu * call #1FC3 pri ko.syntaxe korekce zasobniku ld A,#0D jinak navrat vozu rst PRTOUT vypsan,tzn.proveden ret * *podpgm pro vypis vyrazu PRINT ap. * rst GETACT aktualni znak cp #AC token 'AT' ? jr NZ,#200E ne call #1C79 2 vyhodnocene parametry na calcstack call #1FC3 navrat pri kontrole syntaxe call #2307 prevzeti parametru do _BC ld A,#16 'AT control' jr #201E * cp #AD token 'TAB' ? jr NZ,#2024 ne rst GETNXT >CHADD< +1,dalsi znak call #1C82 1 vyhod. parametr polozi na calcstack call #1FC3 navrat pri kontrole syntaxe call INTEG2 prenese parametr do _BC ld A,#17 'TAB control' rst PRTOUT vypis 'AT control' nebo 'TAB control' ld A,C prvni parametr rst PRTOUT ld A,B a druhy na vypis rst PRTOUT ret
2024 2024 2027 2028 202B 202C 202C 202C 202C 202F 2032 2036 2039 203C 203C 203C 203C 203D 203E 203F 2040 2041 2042 2043 2045 2045 2045 2045 2045 2047 2048 204A 204B 204D 204E 204E 204E 204E 204F 2051 2053 2055 2057 205A 205C 205E 205F 2061 2061 2063 2064 2064 2067 2068 206B 206D 206E 206F 2070 2070
* CD F2 21 D0 CD 70 20 D0 call ret call ret COLORL NC #2070 NC nejaky vyraz pro zmenu barvy ? ano kontrola,zda musi byt zmenen proud ano
* *vypisovane znaky museji byt retezcovy nebo numericky vyraz * CD FB 24 call SCANN vyhodnoceni vyrazu CD C3 1F call #1FC3 navrat pri kontrole syntaxe FD CB 01 76 bit 6,(FLAGS) test druhu vyrazu CC F1 2B call Z,#2BF1 retezec:zjisti potrebne parametry C2 E3 2D jp NZ,#2DE3 jinak numericky vyraz * *smycka pro vypis retezce * 78 ld A,B jiz je delka retezce B1 or C nulova ? 0B dec BC (pocitadlo delky -1) C8 ret Z ano 1A ld A,(DE) prevzeti znaku 13 inc DE presunuti ukazatele D7 rst PRTOUT vypis znaku 18 F7 jr #203C zpet na zacatek smycky * *podpgm pro zjisteni,zda skoncil vypis *pokud ano:nastaveno ZERO * FE 29 cp ')' uzaviraci zavorka ? C8 ret Z ano FE 0D cp #0D navrat vozu ('ENTER') ? C8 ret Z ano FE 3A cp ':' dvojtecka ? C9 ret * *podpgm pro presun PRINTove pozice * DF rst GETACT aktualni znak FE 3B cp ';' je strednik ? 28 14 jr Z,#2067 ano FE 2C cp ',' carka ? 20 0A jr NZ,#2061 ne CD 30 25 call CHESYN pokud kontrola syntaxe 28 0B jr Z,#2067 pak se nic nevypise 3E 06 ld A,6 jinak 'PRINT comma' D7 rst PRTOUT odeslana k vypisu 18 06 jr #2067 * FE 27 cp ''' je to apostrof ? C0 ret NZ ne:navrat * CD F5 1F call #1FF5 vypis navratu vozu E7 rst GETNXT >CHADD< +1,dalsi znak CD 45 20 call #2045 konec tisku ? 20 01 jr NZ,#206E ne C1 pop BC ano:odstraneni navratove adresy BF cp A pri kodech zmeny pozice vzdy C9 ret nastaveno ZERO * *podpgm pro zmenu proudu,pokud je to potrebne
2070 2070 2072 2073 2074 2075 2078 2079 207C 207F 2081 2084 2087 2088 2089 2089 2089 2089 2089 208C 208E 2090 2093 2096 209A 209D 20A0 20A4 20A7 20A8 20AA 20AC 20AD 20B1 20B3 20B4 20B7 20BB 20BE 20C1 20C1 20C1 20C1 20C1 20C4 20C6 20C8 20CA 20CB 20CE 20CF 20D1 20D4 20D5 20D8 20D8 20DA 20DC 20DD 20E0
* FE 37 C0 E7 CD A7 CD CD FE D2 CD A7 C9 23 cp scf ret rst call and call call cp jp call and ret '#' NZ GETNXT #1C82 A #1FC3 INTEG1 16 NC,ISTREA OPCAN A pokud ne '#' (navrat vzdy s nastavenym CARRY) pak navrat >CHADD< +1,dalsi znak parametr na zasobnik kalkulatoru smazani CARRY navrat pri kontrole syntaxe parametr prenesen do _A proud >16 ? ano:chyba otevreni kanalu smazani CARRY
82 1C C3 94 10 0E 01 1F 1E 16 16
CD 28 3E CD CD FD CD CD ED 3A B8 38 0E 47 ED 3E 90 32 FD CD C3
30 08 01 01 6E 36 C1 EE 4B 6B 03 21
25 16 0D 02 01 20 1B 88 5C 5C
43 88 5C 19 8C CB D9 6E 5C 02 86 0D 0D
CD 28 FE 20 E7 CD DF FE C2 E7 C3 FE 20 E7 CD FD
4E 20 FB 28 0E DF 1F 29 8A 1C B2 21 CA 11 1F 1C CB 37 FE
* *prikaz 'INPUT' *pripadny vypis pri 'INPUT' provaden na spodni cast obrazovky * call CHESYN kontrola syntaxe ? jr Z,#2096 ano ld A,1 kanal -Kcall OPCAN otevren call #0D6E spodni dil obrazu smazan ld (TVFLAG),1 a je mu pridelen jeden radek call #20C1 podpgm pro provedeni 'INPUT' call SYNTX pri kontrole syntaxe na dalsi prikaz ld BC,(SPOSN) aktualni pozice tisku ld A,(DFSZ) je ve spodni casti ? cp B jr C,#20AD ano ld C,33 jinak nastavena na ld B,A zacatek spodniho radku ld (SPOSN),BC platna pozice zapsana ld A,25 pocitadlo scroll sub B ld (SCRCT),A nove nastaveno res 0,(TVFLAG) pozn:zapnut horni dil obrazovky call #0DD9 nastaveni systemovych promennych jp #0D6E a navrat pres rutinu pro smazani spodniho dilu * *vlastni rutina INPUT * call #204E presun pozice ? jr Z,#20C1 ano cp '(' pokud prvni znak neni otviraci jr NZ,#20D8 zavorka,pak skok rst GETNXT >CHADD< +1,dalsi znak call #1FDF volana normalni rutina 'PRINT' rst GETACT posledni znak musi byt cp ')' uzaviraci zavorka jp NZ,#1C8A jinak chyba rst GETNXT dalsi znak jp #21B2 test,zda dalsi INPUTovy termin * cp #CA token 'LINE' ? jr NZ,#20ED ne rst GETNXT >CHADD< +1,dalsi znak call #1C1F urcena cilova adresa promenne set 7,(FLAGX) pozn:"INPUT LINE"
20E4 20E8 20EB 20ED 20ED 20ED 20ED 20F0 20F3 20F6 20FA 20FA 20FA 20FA 20FD 2100 2103 2106 2108 210A 210D 210F 2111 2114 2116 2118 211A 211B 211C 211D 211F 2120 2121 2122 2124 2126 2127 2128 2129 212C 2130 2132 2135 2136 2139 213A 213D 213E 2142 2144 2148 214B 214E 2152 2155 2159 215C 215E 215E 2161
FD CB 01 76 C2 8A 1C 18 0D
CD D2 CD FD
8D AF 1F CB
2C 21 1C 37 BE
CD CA CD 21 CB CB 01 CB 20 3A E6 20 0E B6 77 F7 36 79 0F 0F 30 3E 12 2B 77 22 FD 20 2A E5 2A E5 21 E5 FD 28 ED 2A CD FD CD FD CD 18
30 B2 BF 71 B6 EE 01 7E 0B 3B 40 02 03
25 21 16 5C 00 5C
0D
05 22
5B 5C CB 37 7E 2C 5D 5C 3D 5C 3A 21 CB 04 73 61 A7 36 2C CB B9 03 30 66 3D 5C 5C 11 00 FF 0F 01 BE 21
CD 2C 0F
* *normalni INPUTove promenne * call #2C8D pokud aktualni znak neni pismeno jp NC,#21AF pak skok call #1C1F urceni cilove adresy promenne res 7,(FLAGX) pozn:"nikoliv INPUT LINE" * *okamzity vypis je realizovan z pracovniho prostoru * call CHESYN kontrola syntaxe ? jp Z,#21B2 ano:skok call CLRWOR smazani pracovniho prostoru ld HL,FLAGX res 6,(HL) pozn:retezcovy vysledek set 5,(HL) pozn:INPUT mod ld BC,1 pro okamzity vypis jen jedna pozice bit 7,(HL) 'INPUT LINE' ? jr NZ,#211C ano ld A,(FLAGS) and #40 vstup numericke hodnoty ? jr NZ,#211A ano ld C,3 pro vstup retezce potrebne tri pozice or (HL) bit6 >FLAGS< ld (HL),A pozn:numericky rst REST30 vyhrazeni potrebneho mista ld (HL),#0D zapsan navrat vozu jako zakonceni ld A,C test bitu6 _C rrca rrca skok,pokud jr NC,#2129 potrebne 1 misto (LINE neb numeric.) ld A,'"' uvozovky ld (DE),A ulozeny na prvni dve mista dec HL ld (HL),A ld (KCUR),HL zapsana pozice kurzoru bit 7,(FLAGX) 'INPUT LINE' ? jr NZ,#215E ano ld HL,(CHADD) >CHADD< push HL ld HL,(ERRSP) a citac chyb.zasobniku ulozeny push HL ld HL,#213A navratova adresa pro chybu push HL take bit 4,(FLAGS2) bude pouzit kanal -K- ? jr Z,#2148 ne ld (ERRSP),SP ano:novy citac chyboveho zasobniku ld HL,(WORKSP) _HL na zacatek INPUToveho radku call GETFLO prip.odstraneno cislo z calcstacku ld (ERRNR),#FF pozn:"bez chyby" call #0F2C prevezme INPUT pomoci editoru res 7,(FLAGS) pozn:kontrola syntaxe call #21B9 aby mohla byt provedena kontrola jr #2161 * call #0F2C prevzeti INPUTu *
2161 2165 2168 216A 216D 2171 2174 2177 2179 217B 217D 217F 2180 2181 2184 2185 2188 218C 218F 2192 2196 2199 219B 219B 219E 21A2 21A3 21A5 21A6 21A7 21AA 21AD 21AF 21AF 21B2 21B5 21B5 21B8 21B9 21B9 21B9 21B9 21B9 21B9 21BC 21BF 21C0 21C2 21C4 21C7 21CA 21CB 21CD 21CE 21CE 21CF 21D0 21D0 21D3 21D4
FD CD 20 CD ED CD 21 CB CB CB 20 E1 E1 22 E1 22 FD CD 2A FD 22 18 2A ED 37 ED 44 4D CD CD 18
36 D6 0A 1D 4B D9 71 AE 7E BE 1C
22 00 21 11 82 5C 0D 5C
3D 5C 5F CB B9 5F 36 5D 17 5C 01 FE 21 5C 26 00 5C * 63 5C 5B 61 5C 52 B2 2A FF 2A 03 *
ld call jr call ld call ld res bit res jr pop pop ld pop ld set call ld ld ld jr ld ld scf sbc ld ld call call jr
(KCUR+1),0 #21D6 NZ,#2174 #111D BC,(ECHOE) #0DD9 HL,FLAGX 5,(HL) 7,(HL) 7,(HL) NZ,#219B HL HL (ERRSP),HL HL (XPTR),HL 7,(FLAGS) #21B9 HL,(XPTR) (XPTR),0 (CHADD),HL #21B2
adresa kurzoru vracena INPUT pres kanal -K- ? ne vlozeny udaj prenesen na obrazovku zaktualizovana pozice >ECHOE< ve spodni casti obrazovky pozn:"editor mod" 'INPUT LINE' ? (tato pozn. vzdy zrusena) ano odstranena navratova adresa #213A stara hodnota citace chyb.zasobniku zapsana zpet originalni >CHADD< zapsano do >XPTR< pozn:beh pgmu promenne pridelena vlozena hodnota >CHADD< opet v _HL nulovano >XPTR< orig.hodnota >CHADD< zapsana
HL,(STKBOT) delka INPUT radku DE,(WORKSP) v pracovnim prostoru HL,DE B,H C,L #2AB2 #2AFF #21B2 vypocitana a okopirovana do _BC parametr na zasobnik kalkulatoru probehne prideleni probehne PRINTovy vypis nasleduje znak pro zmenu PRINT pozice ? ano:pokracuje smycka INPUT jinak hotovo
CD FC 1F CD 4E 20 CA C1 20 C9
2A 22 DF FE 28 3A CD DF FE C8 CF 0B
61 5C 5D 5C E2 0C 71 5C 59 1C 0D
CD 30 25 C8
* *podpgm pro prideleni hodnoty pri 'INPUT' *nejdrive volan s pozn."kontrola syntaxe" *potom bez ni,takze se prideleni provede ("beh pgmu") * ld HL,(WORKSP) na prvni pozici pracovniho prostoru ld (CHADD),HL se nastavi >CHADD< rst GETACT aktualni znak cp #E2 je 'STOP' ? jr Z,#21D0 ano ld A,(FLAGX) jinak se provede prideleni call #1C59 hodnoty do promenne rst GETACT je aktualni znak cp #0D navrat vozu ? ret Z ano * rst ERROUT hlaseni DEFB #0B 'Nonsense in BASIC' * call CHESYN ret Z bez chyby pri kontrole syntaxe *
21D4 21D4 21D4 21D5 21D6 21D6 21D6 21D6 21D6 21D9 21DA 21DB 21DC 21DD 21DE 21E0 21E1 21E1 21E1 21E1 21E2 21E2 21E5 21E6 21E7 21E9 21EB 21ED 21EF 21F2 21F2 21F4 21F5 21F7 21F8 21F9 21F9 21FA 21FB 21FC 21FE 21FF 2202 2203 2204 2207 2208 220B 220C 220D 220E 220F 2210 2211 2211 2211 2211 2211 2211 2211
CF 10
2A 51 5C 23 23 23 23 7E FE 4B C9
E7 CD D8 DF FE 28 FE 28 C3 F2 21 2C F6 3B F2 8A 1C
FE D9 D8 FE DF 3F D8 F5 E7 F1 D6 F5 CD F1 A7 CD F5 CD 57 F1 D7 7A D7 C9
C9 82 1C C3 1F 94 1E
D6 11
*prvni znak v INPUTU byl 'STOP' * rst ERROUT hlaseni DEFB #10 'STOP in INPUT' * *podpgm ke zjisteni,zda je pro INPUT pouzit kanal -K*pokud ano,nastaveno ZERO * ld HL,(CURCHL) pocatecni adresa kanalovych informaci inc HL inc HL inc HL +4 inc HL ld A,(HL) test kanalu cp 'K' kanal -K- ? ret * *podpgm pro zpracovani "barevnych" instrukci * rst GETNXT >CHADD< +1,dalsi znak *normalni vstupni bod ONECOL call COLORL test na instrukci barvy ret C nejde o ni rst GETACT jinak prevezme aktualni znak cp ',' kdyz je to oddelovaci carka jr Z,#21E1 cp ';' nebo strednik jr Z,#21E1 zpracuje dalsi instrukce barvy jp #1C8A jinak chyba * COLORL cp #D9 pokud neni token v mezich #D9..#DE ret C ('INK'..'OVER'),pak navrat s cp #DF nastavenym CARRY ccf tzn.nejde o instrukci barvy ret C * push AF jinak token uschovan rst GETNXT >CHADD< +1 pop AF token obnoven sub #C9 a upraven na ridici znak #10..#15 push AF tento znovu uschovan call #1C82 parametr na zasobnik kalkulatoru pop AF a obnoven ridici znak (control) and A call #1FC3 pri kontrole syntaxe opusteni rutiny push AF jinak znak uschovan call INTEG1 parametr ze zasobniku kalkulatoru ld D,A prevzat do _D pop AF obnoveni ridiciho znaku rst PRTOUT a jeho vypis ld A,D taktez parametr rst PRTOUT na vypis ret * *nasledujici podpgm je volan PRINTovou rutinou *pritom jsou >ATTRT<, >MASKT< a >PFLAG< ovlivneny *pozadovanymi hodnotami *_A obsahuje ridici znak,_D parametr * sub #11 tyto operace rozdilu a souctu slouzi
2213 2215 2217 2217 2219 221B 221D 221D 221F 2220 2222 2224 2224 2225 2226 2228 2229 222A 222C 222E 222F 2232 2234 2234 2234 2234 2235 2237 2239 223A 223B 223C 223E 223F 2240 2242 2244 2244 2245 2246 2246 2249 224B 224D 224E 2250 2251 2252 2254 2256 2257 2257 2258 2258 2259 225C 225C 225C 225C 225E
CE 00 28 1D * D6 02 CE 00 28 56 * FE 01 7A 06 01 20 04 * 07 07 06 4F 7A FE 30 79 21 18 04 02 16 91 5C 38
adc 0 jr Z,#2234 sub 2 adc 0 jr Z,#2273 cp ld ld jr rlca rlca ld ld ld cp jr ld ld jr 1 A,D B,1 NZ,#2228
k oddeleni 'INK' a 'PAPER' jde o jeden z nich podobne zde urceni 'BRIGHT' a 'FLASH' pri nich skok 'OVER control' ? parametr do _A maska pro OVER ano, 'OVER control' zde zpracovani 'INVERSE' bit2 ma hodnotu parametru maska k vykryti uschova hodnoty prevzeti parametru a jeho test (povoleny jen 1/0) spatna hodnota:chyba hodnota zpet do _A prectena adresa >PFLAG< pro zmenu
7A 06 38 07 07 07 06 4F 7A FE 38 CF 13 21 FE 38 7E 28 B0 2F E6 28 78 4F
07 05
38 0A 02
8F 5C 08 0B 07 24 01
79 CD 6C 22
3E 07 BA
* *zpracovani 'INK' a 'PAPER' (ridicich znaku) * ld A,D parametr do _A ld B,7 maska pro 'INK' jr C,#223E skok pri 'INK' rlca jinak parametr presunut rlca o tri bity doleva pro 'PAPER' rlca (vynasobenim 8) ld B,#38 maska pro 'PAPER' ld C,A ulozeni hodnoty ld A,D prevzeti parametru cp 10 pro test,zda je 0..9 jr C,#2246 je v poradku * rst ERROUT hlaseni DEFB #13 'Invalid colour' * ld HL,ATTRT adresa potrebna ke zmene sysvar cp 8 parametr v mezich 0..7 ? jr C,#2258 ano ld A,(HL) precteni >ATTRT< jr Z,#2257 pri parametru 8 nebude nic meneno or B zbyva parametr 9 cpl barva PAPER/INK musi byt bila/cerna and #24 jr Z,#2257 skok pri cerne barve ld A,B PAPER/INK je bily * ld C,A ulozeni hodnoty * ld A,C vraceni hodnoty call #226C >ATTRT< bude zmeneno * *nyni je zpracovana >MASKT< * ld A,7 zmena bude jen pri cp D PAPER/INK 8 nebo 9
225F 2260 2263 2263 2263 2263 2264 2265 2267 2268 226A 226B 226C 226C 226C 226C 226C 226D 226E 226F 2270 2271 2272 2273 2273 2273 2273 2274 2275 2276 2278 227A 227B 227D 227E 227F 2281 2283 2285 2287 2287 2288 228B 228E 228F 2290 2291 2292 2294 2294 2294 2294 2294 2294 2297 2299 229B 229D 229E 229F
9F CD 6C 22
07 07 E6 50 47 3E 08 BA 9F
AE A0 AE 77 23 78 C9
9F 7A 0F 06 20 0F 06 4F 7A FE 28 FE 30
80 03 40 08 04 02 BD
79 21 8F 5C CD 6C 22 79 0F 0F 0F 18 D8
CD FE 30 D3 07 07 07
94 1E 08 A9 FE
* *jeste uprava >PFLAG< * rlca tvorba masky pro >PFLAG< rlca and #50 pouze bit4 a bit6 ld B,A jsou preneseny do _B ld A,8 uprava probehne pouze cp D pri PAPER/INK 9 sbc A pak _A=#FF,jinak nulove * *podpgm pro nastaveni barvy *_HL ubsahuje adresu,_B masku,_A novou hodnotu * xor (HL) prostrednictvim techto logickych and B operaci jsou zmeneny xor (HL) pouze zadouci bity ld (HL),A zapsani vznikle hodnoty inc HL ukazatel na dalsi bajt (sysvar) ld A,B maska do _A ret * *zpracovani 'FLASH' a 'BRIGHT' (ridici znaky) * sbc A nastaveni ZERO pro 'BRIGHT' ld A,D parametr do _a rrca a rotace (novy bit7 = stary bit0) ld B,#80 maska pro 'FLASH' jr NZ,#227D skok pri 'FLASH' rrca pro 'BRIGHT' dalsi rotace ld B,#40 a maska pro 'BRIGHT' ld C,A ulozeni vznikle hodnoty ld A,D znovu prevzeti parametru cp 8 povoleny jen hodnoty 0/1/8 jr Z,#2287 cp 2 jr NC,#2244 jinak chyba * ld A,C hodnota zpet do _A ld HL,ATTRT adresa pro zmenu call #226C provedeni zmeny ld A,C obnoveni hodnoty v _A rrca "nastavovaci" bit3 prenesen do rrca bitu7 pri 'FLASH',popr. bitu6 rrca pri 'BRIGHT' jr #226C a odpovidajici zmena >MASKT< * *prikaz 'BORDER' *parametr 'BORDER' je realizovan pomoci 'OUT' *soucasne ovlivnuje >BORDCR< * call INTEG1 prevzeti parametru cp 8 povolen jen 0..7 jr NC,#2244 jinak chyba out (#FE),A zaslani na port rlca posun o tri bity doleva rlca (tj.nasobeni 8) rlca
22A0 22A2 22A4 22A6 22A9 22AA 22AA 22AA 22AA 22AA 22AA 22AA 22AC 22AD 22B0 22B1 22B1 22B2 22B3 22B4 22B5 22B6 22B7 22B8 22BA 22BB 22BC 22BD 22BE 22BF 22C0 22C1 22C3 22C4 22C5 22C6 22C7 22C8 22CA 22CB 22CB 22CB 22CB 22CE 22D1 22D2 22D3 22D4 22D5 22D7 22D9 22DC 22DC 22DC 22DC 22DC 22DC 22DF 22E2 22E5
CB 20 EE 32 C9
6F 02 07 48 5C
svetla barva ? ano:cerny INK v editacni zone ne: bily INK nova barva BORDER
3E AF 90 DA F9 24 47 A7 1F 37 1F A7 1F A8 E6 F8 A8 67 79 07 07 07 A8 E6 C7 A8 07 07 6F 79 E6 07 C9
CD CD 47 04 7E 07 10 E6 C3
07 23 AA 22
FD 01 28 2D
CD 07 23 CD E5 22 C3 4D 0D
* *podpgm pro vypocet adresy pixelu na obrazovce *je pouzivan 'PLOT' a 'POINT' se souradnicemi v _BC *pri navratu obsahuje _HL adresu bajtu v odpovidajicim miste *video RAM a _A bitovou pozici bodu v tomto bajtu * PXLADR ld A,#AF y-souradnice (v_B) nesmi byt sub B vetsi nez 175 jp C,#24F9 jinak chyba ld B,A _B=175 -y.souradnice (protoze se pocita odspodu) and A rra scf rra (b0..b7 jsou bity z _B) and A (c0..c7 jsou bity z _C) rra xor B tato manipulace poskytne nasledujici and #F8 vysledek (MSB) v _H: xor B ld H,A 0 1 0 b7 b6 b2 b1 b0 ld A,C s x-souradnici z _C rlca nalozeno obdobne rlca takze vysledek (LSB) v _L rlca vypada takto: xor B and #C7 b5 b4 b3 c7 c6 c5 c4 c3 xor B rlca rlca ld L,A ld A,C a v _A se vytvori and 7 bitova adresa v tomto bajtu ret * *funkce 'POINT' * call #2307 y-souradnice do _B, x do _C call PXLADR vypocet prislusnych adres ld B,A _B jako pocitadlo bitu inc B ld A,(HL) prevzat prislusny bajt rlca a rotovan dokud se hledany bit djnz #22D4 nedostane na pozici bit0 and 1 je roven 1 pro INK a 0 pro PAPER jp #2D28 a tato hodnota na calcstack * *prikaz 'PLOT' *pri vstupu do rutiny jsou souradnice ulozeny na calcstacku *bod je nastaven s ohledem na stav INVERSE a OVER (v >PFLAG<) * PLTMAI call #2307 y-souradnice do _B, x-sourad.do _C call PLOT1 podpgm PLOT jp ACTCOL nastaveni soucasnych barev *
22E5 22E9 22EC 22ED 22EE 22F0 22F1 22F3 22F4 22F5 22F5 22F8 22FA 22FC 22FD 22FF 2301 2302 2302 2302 2302 2303 2304 2307 2307 2307 2307 2307 2307 230A 230B 230C 230F 2310 2311 2312 2313 2314 2314 2314 2314 2314 2314 2317 231A 231C 231D 231F 2320 2320 2320 2320 2320 2320 2321 2323 2326 2327 232A 232D
ED CD 47 04 3E 0F 10 47 7E FD CB 20 A0 CB 20 A8
(COORDS),BC PXLADR B,A B A,#FE #22F0 B,A A,(HL) C,(PFLAG) 0,C NZ,#22FD B 2,C NZ,#2303 B
nastaveni systemove promenne urceni adres bodu bitova adresa v bajtu do _B +1 (pro dalsi vypocet) maska s 0 v _A rotuje,dokud neni nalezena spravna pozice bitu pozice nuloveho bitu do _B vyzvednuti bajtu,do ktereho bude zaznamenan bod test na 'OVER 1' ano ne:bit se nuluje 'INVERSE 1' ? ano mozny vysledek : 'INV.1' a 'OVER 1' : bit zustane 'INV.1' a 'OVER 0' : bit nulovan 'INV.0' a 'OVER 1' : bit invertovan 'INV.0' a 'OVER 0' : bit nastaven vysledek zapsan (zpravidla do video) jeste uprava prislusneho atributu
2F 77 C3 DB 0B
CD 14 23 47 C5 CD 14 23 59 C1 51 4F C9
CD DA 0E C8 0E C9
D5 2D F9 24 01 FF
DF FE C2 E7 CD CD EF
2C 8A 1C 82 1C EE 1B
* *podpgm prenese posledni dve hodnoty z calcstacku do _BC *_D,_E budou obsahovat odpovidajici znamenka *v _A se objevi nizsi bajt (tzn. _A=_C) * call STAINA prevzeti posledni hodnoty do _A ld B,A a predani do _B push BC jeji uschova call STAINA prevzeti druhe hodnoty do _A ld E,C znamenko do _E (+1/-1) pop BC obnovena prvni hodnota ld D,C jeji znamenko do _D ld C,A druha hodnota do _C ret * *posledni hodnota (cislo v plovouci tecce) z calcstacku do _A *(musi byt #00..#FF). _C prinasi znamenko vysledku *(+1 pro kladnou / -1 pro zapornou hodnotu) * STAINA call #2DD5 prevezme cislo v plovouci tecce jp C,#24F9 prilis velke:chyba ld C,1 _C=1 pro kladne ret Z navrat pri kladnem ld C,#FF jinak _C=-1 pro zaporne ret * *prikaz 'CIRCLE' *nakresli kruznici o polomeru "R" se stredem v "X","Y" *vsechny tri hodnoty nejprve zaokrouhli * CIRCL rst GETACT prevezme aktualni znak cp ',' je to carka ? jp NZ,#1C8A ne:chyba rst GETACT >CHADD< +1,dalsi znak call #1C82 polomer prenesen na calcstack call SYNTX pri kontrole syntaxe opusteni rutiny rst CALSW X Y R ;kalkulator
232E 232F 2330 2331 2332 2334 2336 2337 2338 2339 233B 233B 233C 233D 233E 2340 2341 2342 2343 2344 2347 2347 2347 2347 2347 2348 2349 234A 234B 234C 234D 234E 2350 2352 2353 2354 2355 2356 2357 235A 235A 235B 235C 235D 235E 235F 2360 2361 2362 2363 2364 2365 2366 2367 2368 2369 236A 236B 236C 236D
2A 3D 38 7E FE 81 30 05 EF 02 38 18 A1 * EF A3 38 36 83 EF C5 02 38 CD 7D 24
DEFB DEFB DEFB ld cp jr rst DEFB DEFB jr rst DEFB DEFB ld rst DEFB DEFB DEFB call
#2A #3D #38 A,(HL) #81 NC,#233B CALSW #02 #38 PLTMAI CALSW #A3 #38 (HL),#83 CALSW #C5 #02 #38 #247D
X Y abs(R) X Y abs(R)
;abs ;int->float
zjisten exponent polomeru polomer mensi nez 1 ? ne pokud ano:je zrusen X Y ;drop a provede pouze 'PLOT' X Y R PI/2 ;konst->stack
exponent PI/2 zmenen na 2*PI X Y R 2*PI X Y R 2*PI ;2*PI->mem5 X Y R ;drop konec iniciace pocatecnich parametru
C5 EF 31 E1 04 38 7E FE 80 30 08 EF 02 02 38 C1 C3 DC 22 EF C2 01 C0 02 03 01 E0 0F C0 01 31 E0 01 31 E0 A0 C1 02 38
* *kruznice je rozdelena na kratke usecky a tyto zobrazeny *pomoci rutiny DRAW. pocet usecek v _BC (oznaceni "A") * push BC pocet usecek uschovan rst CALSW X Y R DEFB #31 X Y R R ;dup DEFB #E1 X Y R R sin(PI/U) ;mem1->stack DEFB #04 X Y R R*sin(PI/U) ;multi DEFB #38 ld A,(HL) test zda prvni dilek cp #80 je mensi nez .5 jr NC,#235A ne rst CALSW jinak krome "X" a "Y" vse smaze DEFB #02 ;drop DEFB #02 ;drop DEFB #38 navrat z kalk. pop BC korekce zasobniku jp PLTMAI zobrazeni bodu * rst CALSW X Y R R*sin(PI/A) DEFB #C2 R*sin(PI/A)->mem2 DEFB #01 X Y R*sin(PI/A) R DEFB #C0 R->mem0 DEFB #02 X Y R*sin(PI/A) DEFB #03 X Y-R*sin(PI/A) DEFB #01 Y-R*sin(PI/A) X DEFB #E0 Y-R*sin(PI/A) X R DEFB #0F Y-R*sin(PI/A) X+R DEFB #C0 X+R->mem0 DEFB #01 I=X+R,J=Y-R*sin(PI/A) DEFB #31 I J J DEFB #E0 I J J I DEFB #01 I J I J DEFB #31 I J I J J DEFB #E0 I J I J J I DEFB #A0 I J I J J I 0 DEFB #C1 0->mem1 DEFB #02 I J I J J I DEFB #38 konec
236E 236E 2371 2374 2375 2376 2379 237A 237B 237E 237F 2382 2382 2382 2382 2382 2382 2382 2383 2385 2387 238A 238D 238D 238E 2391 2394 2395 2396 2397 2398 2399 239A 239B 239C 239E 239F 23A0 23A3 23A3 23A4 23A5 23A6 23A7 23A8 23A9 23AA 23AB 23AC 23AD 23AE 23AF 23B0 23B1 23B2 23B3 23B4 23B5 23B6 23B8
* FD CD 6F E5 CD E1 67 22 C1 C3 34 62 94 1E 94 1E 7D 5C 20 24 inc call ld push call pop ld ld pop jp (IY+#62) INTEG1 L,A HL INTEG1 HL H,A (COORDS),HL BC #2420 exponent mem2 +1 X+R do _A kopie do _L a uschovana do _A hodnota Y-R*sin(PI/A) okopirovana do _H a obe hodnoty zapsany do >COORDS< obnoveni pocitadla dilku a jeden zobrazen
DF FE 28 CD C3 E7 CD CD EF C5 A2 04 1F 31 30 30 00 02 38 C3
2C 06 EE 1B 77 24 82 1C EE 1B
06 77 24
C0 02 C1 02 31 2A E1 01 E1 2A 0F E0 05 2A E0 01 3D 38 7E FE 81 30 07
* *prikaz 'DRAW' *souradnice zacatku (X0,Y0) usecky jsou ulozeny v >COORDS< *pokud za cilovymi souradnicemi (X,Y) nenasleduje dalsi *parametr,je zobrazena primka do x0+X,y0+Y * rst GETACT aktualni znak cp ',' testovan na carku jr Z,#238D ano:nasleduje treti parametr call SYNTX pri kontrole syntaxe na dalsi prikaz jp #2477 jinak zobrazi primku * rst GETNXT na dalsi znak,zde uhel call #1C82 jeho hodnota na calcstack call SYNTX pri kontrole syntaxe na dalsi prikaz rst CALSW X Y G ("G" je uhel) DEFB #C5 G->mem5 DEFB #A2 X Y G .5 DEFB #04 X Y G/2 DEFB #1F X Y sin(G/2) DEFB #31 X Y sin(G/2) sin(G/2) DEFB #30 X Y sin(G/2) (1 neb 0) ;not (G=0?) DEFB #30 X Y sin(G/2) (0 neb 1) ;not (G<>0?) DEFB #00 #06 X Y sin(G/2) ;jrt PICANG DEFB #02 X Y ;uhel byl 2*n*PI=0 DEFB #38 jp #2477 zobrazeni usecky * PICANG DEFB #C0 sin(G/2)->mem0 DEFB #02 X Y DEFB #C1 Y->mem1 DEFB #02 X DEFB #31 X X DEFB #2A X X'=abs(X) DEFB #E1 X X' Y DEFB #01 X Y X' DEFB #E1 X Y X' Y DEFB #2A X Y X' Y'=abs(Y) DEFB #0F X Y X'+Y' DEFB #E0 X Y X'+Y' sin(G/2) DEFB #05 X Y Z'=(X'+Y')/sin(G/2) DEFB #2A X Y Z=abs(Z') DEFB #E0 X Y Z sin(G/2) DEFB #01 X Y sin(G/2) Z DEFB #3D X Y sin(G/2) Z ;int->float DEFB #38 X Y sin(G/2) Z ld A,(HL) exponent Z cp #81 je >= 1 ? jr NC,#23C1 ano
23BA 23BB 23BC 23BD 23BE 23C1 23C1 23C4 23C5 23C6 23C7 23C8 23C9 23CA 23CB 23CC 23CD 23CE 23CF 23D0 23D1 23D2 23D3 23D4 23D5 23D6 23D7 23D8 23D9 23DA 23DB 23DC 23DD 23DE 23DF 23E0 23E1 23E2 23E3 23E4 23E5 23E6 23E7 23E8 23E9 23EA 23EB 23EC 23ED 23EE 23EF 23F0 23F1 23F2 23F3 23F4 23F5 23F6 23F7 23F8
EF 02 02 38 C3 77 24 * CD 7D 24 C5 EF 02 E1 01 05 C1 02 01 31 E1 04 C2 02 01 31 E1 04 E2 E5 E0 03 A2 04 31 1F C5 02 20 C0 02 C2 02 C1 E5 04 E0 E2 04 0F E1 01 C1 02 E0 04 E2 E5 04 03 C2 2A E1
rst DEFB DEFB DEFB jp call push rst DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB
CALSW #02 #02 #38 #2477 #247D BC CALSW #02 #E1 #01 #05 #C1 #02 #01 #31 #E1 #04 #C2 #02 #01 #31 #E1 #04 #E2 #E5 #E0 #03 #A2 #04 #31 #1F #C5 #02 #20 #C0 #02 #C2 #02 #C1 #E5 #04 #E0 #E2 #04 #0F #E1 #01 #C1 #02 #E0 #04 #E2 #E5 #04 #03 #C2 #2A #E1
;drop ;drop
iniciace parametru pocitadlo dilku ulozeno X Y sin(G/2) Z X Y sin(G/2) X Y sin(G/2) sin(G/2*A) X Y sin(G/2*A) sin(G/2) X Y W=sin(G/2*A)/sin(G/2) W->mem1 X Y Y X Y X X Y X X W Y X X*W X*W->mem2 Y X X Y X Y Y X Y Y W X Y Y*W X Y Y*W X*W X Y Y*W X*W G X Y Y*W X*W G G/A X Y Y*W X*W G-G/A X Y Y*W X*W G-G/A .5 X Y Y*W X*W F=(G-G/A)/2 X Y Y*W X*W F F X Y Y*W X*W F sin(F) sin(F)->mem5 X Y Y*W X*W F X Y Y*W X*W cos(F) cos(F)->mem0 X Y Y*W X*W X*W->mem2 X Y Y*W Y*W->mem1 X Y Y*W sin(F) X Y Y*W*sin(F) X Y Y*W*sin(F) X*W X Y Y*W*sin(F) X*W cos(F) X Y Y*W*sin(F) X*W*cos(F) X Y Y*W*sin(F)+X*W*cos(F)=U X Y U Y*W X Y Y*W U U->mem1 X Y Y*W X Y Y*W cos(F) X Y Y*W*cos(F) X Y Y*W*cos(F) X*W X Y Y*W*cos(F) X*W sin(F) X Y Y*W*cos(F) X*W*sin(F) X Y Y*W*cos(F)-X*W*sin(F)=V V->mem2 X Y V'=abs(V) X Y V' U
23F9 23FA 23FB 23FC 23FD 23FE 2400 2401 2404 2405 2406 2407 2408 240B 240E 240F 2410 2411 2412 2413 2416 2419 241A 241B 241C 241D 241E 241F 2420 2420 2420 2420 2420 2420 2421 2423 2425 2426 2427 2428 2429 242A 242B 242C 242D 242E 242F 2430 2431 2432 2433 2434 2435 2436 2437 2438 2439 243A 243B 243C
2A 0F 02 38 1A FE C1 DA C5 EF 01 38 3A CD EF C0 0F 01 38 3A CD EF C5 0F E0 E5 38 C1
81 77 24
7D 5C 28 2D
7E 5C 28 2D
05 28 3C 18 14 EF E1 31 E3 04 E2 E4 04 03 C1 02 E4 04 E2 E3 04 0F C2 02 38 C5 EF C0 02
obnoveni pocitadla dilku * *v nasledujici casti je zobrazen dilek primky *na zasobniku kalkulatoru lezi x0+X y0+Y Xn Yn *jako mezihodnoty jsou pouzity Un=Xn+1-Xn Vn=Yn+1-Yn * dec B usek je hotov ? jr Z,#245F ano:posledni zobrazeni jr #2439 STRAI rst CALSW !! n-1,n+1 jsou indexy !! DEFB #E1 Un-1 DEFB #31 Un-1 Un-1 DEFB #E3 Un-1 Un-1 cos(G/A) DEFB #04 Un-1 Un-1*cos(G/A) DEFB #E2 Un-1 Un-1*cos(G/A) Vn-1 DEFB #E4 Un-1 Un-1*cos(G/A) Vn-1 sin(G/A) DEFB #04 Un-1 Un-1*cos(G/A) Vn-1*sin(G/A) DEFB #03 Un-1 Un-1*cos(G/A)-Vn-1*sin(G/A) DEFB #C1 Un=Un-1*cos... ->mem1 DEFB #02 Un-1 DEFB #E4 Un-1 sin(G/A) DEFB #04 Un-1*sin(G/A) DEFB #E2 Un-1*sin(G/A) Vn-1 DEFB #E3 Un-1*sin(G/A) Vn-1 cos(G/A) DEFB #04 Un-1*sin(G/A) Vn-1*cos(G/A) DEFB #0F Un-1*sin(G/A)+Vn-1*cos(G/A)=Vn DEFB #C2 Vn->mem2 DEFB #02 - ;(x0+X... je jeste na calcstacku) DEFB #38 push BC pocitadlo dilku uschovano rst CALSW x0+X y0+Y Xn Yn DEFB #C0 Yn->mem0 DEFB #02 x0+X y0+Y Xn
DEFB DEFB DEFB DEFB ld cp pop jp push rst DEFB DEFB ld call DEFB DEFB DEFB DEFB DEFB ld call rst DEFB DEFB DEFB DEFB DEFB pop
#2A #0F #02 #38 A,(DE) #81 BC C,#2477 BC CALSW #01 #38 A,(COORDS) #2D28 #EF #C0 #0F #01 #38 A,(COORDS+1) #2D28 CALSW #C5 #0F #E0 #E5 #38 BC
X Y V' U'=abs(U) X Y V'+U' X Y _DE ukazuje na exponent V'+U' prevzeti exponentu V'+U' < 1 ? (obnoveno pocitadlo dilku) ano:pouze zobrazeni primky pocitadlo dilku uschovano X Y Y X navrat z kalk. precteni x0 a ulozeni na calcstack Y X x0 x0->mem0 Y X+x0 X+x0 Y prevzeti y0 a ulozeni na calcstack X+x0 Y y0 y0->mem5 X+x0 Y+y0 X+x0 Y+y0 x0 X+x0 Y+y0 x0 y0
243D 243E 243F 2440 2441 2444 2447 2448 2449 244A 244B 244C 244D 244E 244F 2450 2453 2456 2457 2458 2459 245C 245D 245F 245F 245F 2460 2461 2462 2463 2464 2467 246A 246B 246C 246D 246E 2471 2474 2475 2476 2477 247A 247D 247D 247D 247D 247D 247D 247D 247D 247E 247F 2480 2481 2483 2484 2485 2486 2487
E1 0F 31 38 3A CD EF 03 E0 E2 0F C0 01 E0 38 3A CD EF 03 38 CD C1 10 EF 02 02 01 38 3A CD EF 03 01 38 3A CD EF 03 38 CD C3
7D 5C 28 2D
7E 5C 28 2D
B7 24 C6 *
DEFB DEFB DEFB DEFB ld call rst DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB ld call rst DEFB DEFB call pop djnz rst DEFB DEFB DEFB DEFB ld call rst DEFB DEFB DEFB ld call rst DEFB DEFB call jp
#E1 #0F #31 #38 A,(COORDS) #2D28 CALSW #03 #E0 #E2 #0F #C0 #01 #E0 #38 A,(COORDS+1) #2D28 CALSW #03 #38 #24B7 BC STRAI CALSW #02 #02 #01 #38 A,(COORDS) #2D28 CALSW #03 #01 #38 A,(COORDS+1) #2D28 CALSW #03 #38 #24B7 #0D4D
x0+X y0+Y Xn Un x0+X y0+Y Xn+Un=Xn+1 x0+X y0+Y Xn+1 Xn+1 navrat z kalk. Xn' do _A a na calcstack x0+X y0+Y Xn+1 Xn+1 Xn' x0+X y0+Y Xn+1 Xn+1-Xn'=Un' x0+X y0+Y Xn+1 Un' Yn x0+X y0+Y Xn+1 Un' Yn Vn ... Un' Yn+Vn=Yn+1 Yn+1->mem0 ... Yn+1 Un' ... Yn+1 Un' Yn+1 Yn' do _A a na calcstack ... Un' Yn+1 Yn' ... Un' Yn+1-Yn'=Vn' x0+X y0+Y Xn+1 Yn+1 Un' Vn' zobrazeni useku pocitadlo obnoveno dale ve smycce pro zobrazeni vsech dilku smazani cilovych souradnic posledniho dilku y0+Y x0+X Xm (cilovy bod) do _A a na calcstack y0+Y x0+X Xm y0+Y x0+X-Xm x0+X-Xm y0+Y Ym (koncovy bod) do _A a na calcstack x0+X-Xm y0+Y Ym x0+X-Xm y0+Y-Ym posledni dilek do x0+X,y0+Y zobrazen nastaveny soucasne barvy
7D 5C 28 2D
7E 5C 28 2D
B7 24 4D 0D
EF 31 28 34 32 00 01 05 E5 01 05
* *podpgm pro prepocet pocatecnich parametru *pri volani podpgmem pro zobrazeni kruznice lezi na *calcstacku X,Y,R (polomer,zde "Z") *pri volani rutinou 'DRAW' zde lezi X,Y,sin(G/2),Z *vypocet bude proveden jen pro "Z" * rst CALSW Z DEFB #31 Z Z DEFB #28 Z sqr(Z) DEFB #34 Z sqr(Z) 2 DEFB #32 #00 (=2 v plovouci tecce) DEFB #01 Z 2 sqr(Z) DEFB #05 Z 2/sqr(Z) DEFB #E5 Z 2/sqr(Z) G DEFB #01 Z G 2/sqr(Z) DEFB #05 Z G*sqr(Z)/2
2488 2489 248A 248D 248F 2491 2493 2495 2497 2498 249B 249C 249D 249E 249F 24A0 24A1 24A2 24A3 24A4 24A5 24A6 24A7 24A8 24A9 24AA 24AB 24AC 24AD 24AE 24AF 24B0 24B1 24B2 24B3 24B4 24B5 24B6 24B7 24B7 24B7 24B7 24BA 24BA 24BB 24BC 24BE 24BF 24C0 24C1 24C2 24C4 24C4 24C5 24C6 24C7 24C8 24C9 24CB 24CC
2A 38 CD 38 E6 C6 30 3E F5 CD EF E5 01 05 31 1F C4 02 31 A2 04 1F C1 01 C0 02 31 04 31 0F A1 03 1B C3 02 38 C1 C9
D5 2D 06 FC 04 02 FC 28 2D
DEFB DEFB call jr and add jr ld push call rst DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB pop ret
#2A #38 #2DD5 C,#2495 #FC 4 NC,#2497 A,#FC AF #2D28 CALSW #E5 #01 #05 #31 #1F #C4 #02 #31 #A2 #04 #1F #C1 #01 #C0 #02 #31 #04 #31 #0F #A1 #03 #1B #C3 #02 #38 BC
Z abs(G*sqr(Z)/2)=A1 A1 do _A _A>256:prevezme 252 4*int(A1/4) +4 skok pri < 256 jinak _A=252 usek uschovan a take polozen na calcstack Z A (=delka useku) Z A G Z G A Z G/A Z G/A G/A Z G/A sin(G/A) sin(G/A)->mem4 Z G/A Z G/A G/A Z G/A G/A .5 Z G/A .5*G/A Z G/A sin(G/A/2) sin(G/A/2)->mem1 Z sin(G/A/2) G/A G/A->mem0 Z sin(G/A/2) Z sin(G/A/2) sin(G/A/2) Z sin(G/A/2)*sin(G/A/2)=S*S Z S*S S*S Z 2*S*S Z 2*S*S 1 Z 2*S*S-1 Z 1-2*S*S 1-2*S*S->mem3 Z pocitadlo dilku obnoveno v _BC
CD 07 23 79 B8 30 06 69 D5 AF 5F 18 07 B1 C8 68 41 D5 16 00 60 78
* *podpgm pro zobrazeni primky * call #2307 abs(Y) do _B, abs(X) do _C znamenko X do _E, znamenko Y do _D ld A,C cp B X porovnano s Y jr NC,#24C4 takze muze byt predano vetsi do _H ld L,C mensi do _L push DE uschova smeru (dan znamenky) xor A nulovano _A ld E,A _E=0: 1.krok : -1/0/1 (horizontalne) jr #24CB * or C pri X>=Y:test,zda oba parametry 0 ret Z ano:navrat ld L,B abs(Y) do _L ld B,C abs(X) do _B push DE uschova smeru ld D,0 _D=0:1.krok:-1/0/1 (vertikalne) ld H,B vetsi hodnota z abs(X) a abs(Y) do _H ld A,B a do _A
24CD 24CE 24CF 24D1 24D2 24D4 24D5 24D6 24D7 24D8 24D9 24DB 24DC 24DD 24DE 24DF 24E2 24E3 24E4 24E5 24E6 24E7 24E8 24EA 24EA 24EC 24ED 24EE 24F1 24F2 24F3 24F5 24F6 24F7 24F9 24F9 24FA 24FB 24FB 24FB 24FB 24FB 24FB 24FB 24FB 24FB 24FB 24FC 24FE 24FF 2500 2503 2506 2507 250A 250C 250D 250E 250F 250F
1F 85 38 BC 38 94 4F D9 C1 C5 18 4F D5 D9 C1 2A 78 84 47 79 3C 85 38 28 3D 4F CD D9 79 10 D1 C9 28 CF 0A
03 07
04
7D 5C
0D 0D E5 22 D9 F3 *
rra add jr cp jr sub ld exx pop push jr ld push exx pop ld ld add ld ld inc add jr
delena 2 test na L+H/2>256 ano:krok po diagonale L+H/2<H,potom horizontalni nebo vertikalni krok _A-_H do _C alternativni registry BC smer do _BC' BC ale ponechan na zasobniku #24DF a zobrazeni C,A _A uschovano do _C DE uschova smeru alternativni registry BC smer do _BC' HL,(COORDS) startovni hodnota A,B Y.krok do _A H prictena Y.souradnice B,A a ulozeno do _B A,C X.krok A +1 L + X.souradnice C,#24F7 zde test,zda zobrazeni nepresahuje okraj obrazu jr Z,#24F9 nulove CARRY a ZERO:chyba dec A zkorigovan _A ld C,A kopie do _C call PLOT1 zobrazeni bodu exx normalni sada registru ld A,C x.hodnota do _A djnz #24CE znovu ve smycce pop DE korekce zasobniku ret jr Z,#24EC ZERO a CARRY v poradku L C,24D4 H C,#24DB H C,A rst ERROUT DEFB #0A hlaseni 'Integer out of range'
DF 06 C5 4F 21 CD 79 D2 06 4E 09 E9
00 96 25 DC 16 84 26 00
* *============================================================= *podpgm pro vyhodnoceni vyrazu *vysledek je po ukonceni jako posledni hodnota na zasobniku *kalkulatoru (numericky),v pripade retezce ma 5 bajtu *nasledujici vyznam: prvni neni definovan,druhy a treti jsou *pocatecni adresa a posledni dva obsahuji delku *bit6 >FLAGS< je 1 pri numerickem a 0 pri retezcovem vysledku * SCANN rst GETACT prevzeti prvniho znaku ld B,0 _B nulovano jako znacka push BC a uschovano ld C,A hledany znak do _C ld HL,#2596 bazova adresa tabulky funkci call LOOKTA hledani v tabulce ld A,C znak zpet do _A jp NC,#2684 znak nebyl nalezen ld B,0 ld C,(HL) ofset do _BC add HL,BC pricten k _HL dava vstupni adresu jp (HL) pro vykonnou rutinu * *podpgm pro vyhledani znaku '"' (uvozovky)
250F 250F 2512 2513 2515 2518 251A 251C 251F 2521 2522 2522 2522 2522 2523 2525 2527 252A 252B 252D 2530 2530 2530 2530 2530 2534 2535 2535 2535 2535 2535 2535 2538 253B 253E 253F 2540 2541 2542 2543 2545 2546 2547 2548 254A 254C 254D 254F 2550 2551 2552 2553 2554 2556 2557 2559 255A 255B 255D 255E
* CD 03 FE CA FE 20 CD FE C9 74 00 0D 8A 1C 22 F3 74 00 22 call inc cp jp cp jr call cp ret #0074 BC #0D Z,#1C8A '"' NZ,#250F #0074 '"' >CHADD< +1,dalsi znak pocitadlo +1 navrat vozu ? ano:chyba uvozovky ? ne >CHADD< +1,dalsi znak pokud je dalsi znak znovu uvozovky, je nastaveno ZERO
* *podpgm pro kontrolu,zda nasleduji potrebne dve souradnice * E7 rst GETNXT >CHADD< +1,dalsi znak FE 28 cp '(' oteviraci zavorka ? 20 06 jr NZ,#252D ne:chyba CD 79 1C call #1C79 ulozi obe hodnoty na calcstack DF rst GETACT dalsi aktualni znak FE 29 cp ')' uzaviraci zavorka ? C2 8A 1C jp NZ,#1C8A ne:chyba * *tento podpgm slouzi ke zjisteni,zda se prave vykonava *kontrola syntaxe nebo zda bezi BASIC pgm * FD CB 01 7E CHESYN bit 7,(FLAGS) bit7=0 znaci kontrolu syntaxe C9 ret * *podpgm pro zjisteni znaku na souradnicich X,Y pro 'SCREEN$' *normalne muze najit jen znaky ze sady v ROM (od #3D00), *tedy v mezich #20..#7F * CD 07 23 call #2307 y.souradnice do _B, x do _C 2A 36 5C ld HL,(CHARS) bazova adresa generatoru -256 11 00 01 ld DE,#0100 proto 256 19 add HL,DE pricteno 79 ld A,C x.souradnice do _A 0F rrca krat 32 0F rrca tim je stanoven LSB adresy 0F rrca E6 E0 and #E0 A8 xor B 5F ld E,A vysledek do _E 79 ld A,C MSB adresy E6 18 and #18 stanoven a EE 40 xor VIDEO (bit6 vzdy =1) 57 ld D,A vlozen do _D 06 60 ld B,96 existuje 96 znaku C5 push BC uschovano pocitadlo D5 push DE i ukazatel do obrazu E5 push HL taktez adresa generatoru znaku 1A ld A,(DE) porovnani prvniho pixel-radku znaku AE xor (HL) s bajtem ve znakove sade 28 04 jr Z,#255A prvni radek souhlasi 3C inc A inversni znak ? 20 1A jr NZ,#2573 ne 3D dec A _A zase #FF pro inversi 4F ld C,A _C=0:normal, =#FF:inverse 06 07 ld B,7 jeste bude porovnano 7 radku znaku 14 inc D 23 inc HL
255F 2560 2561 2562 2564 2566 2567 2568 2569 256B 256C 256F 2570 2571 2573 2573 2574 2577 2578 2579 257A 257C 257D 2580 2580 2580 2580 2583 2584 2585 2586 2587 2588 258A 258B 258C 258D 258F 2591 2592 2593 2596 2596 2596 2596 2598 259A 259C 259E 25A0 25A2 25A4 25A6 25A8 25AA 25AC 25AE 25AF 25AF 25AF
1A AE A9 20 10 C1 C1 C1 3E 90 01 F7 12 18
0F F7
80 01 00 0A *
ld xor xor jr djnz pop pop pop ld sub ld rst ld jr pop ld add pop pop djnz ld jp
A,(DE) (HL) C NZ,#2573 #255D BC BC BC A,#80 B BC,1 REST30 (DE),A #257D HL DE,#0008 HL,DE DE BC #254F C,B #2AB2
dalsi radek porovnan s bajtem ze sady bere v uvahu inverzi porovnavan jiny (spatny) znak jinak pokracuje porovnavani znak nalezen: ukazatel do sady a ukazatel do obrazu zruseny kod znaku do _B protoze se odpocitava odzadu musi byt od kodu odecteno 128 jeden bajt pro znak je vyhrazen znak zapsan a navic ulozen na calcstack prevzeti ukazatele na znakovou sadu a aby ukazoval na dalsi znak pricteno 8 ukazatel do obrazu a pocitadlo znaku obnoveny a zpet do prohledavaci smycky pokud znak nenalezen:prazdny retezec ulozen na calcstack
E1 11 08 00 19 D1 C1 10 D3 48 C3 B2 2A
CD 79 0F 0F 0F 4F E6 A8 6F 79 E6 EE 67 7E C3
07 23
E0
03 58 28 2D
22 28 2E 2B A8 A5 A7 A6 C4 AA AB A9 00
1C 4F F2 12 56 57 84 8F E6 BF C7 CE
* *podpgm k urceni hodnoty 'ATTR' (X,Y) * call #2407 y.souradnice do _B, x do _C ld A,C nyni urceni adresy atributu (do _HL) rrca rrca (radek krat 32) rrca ld C,A (poznacen do _C) and #E0 xor B ld L,A (sloupec do _L) ld A,C vytvoreni MSB and 3 xor #58 (usek atributu #5B00..#5BFF) ld H,A MSB adresy do _H ld A,(HL) precten atribut jp #2D28 a ulozen na calcstack * *tabulka ofsetu pro zpracovani vyrazu * DEFB '"' #1C #25B3 textovy mod DEFB '(' #4F #25E8 otviraci zavorka DEFB '.' #F2 #268D desetinna tecka DEFB '+' #12 #25AF scitani DEFB #A8 #56 #25F5 FN (def.funkce) DEFB #A5 #57 #25F8 RND DEFB #A7 #84 #2627 PI DEFB #A6 #8F #2634 INKEY$ DEFB #C4 #E6 #268D BIN DEFB #AA #BF #2668 SCREEN$ DEFB #AB #C7 #2672 ATTR DEFB #A9 #CE #267B POINT DEFB #00 * *nasleduji jednotlive vykonne podpgmy,ktere jsou volany *pomoci ofsetu
25AF 25AF 25AF 25AF 25B0 25B3 25B3 25B3 25B3 25B3 25B4 25B5 25B6 25B9 25BC 25BE 25C1 25C3 25C6 25C8 25C9 25C9 25CA 25CB 25CC 25CD 25CE 25CF 25D1 25D3 25D4 25D5 25D7 25D9 25DA 25DB 25DE 25E0 25E2 25E5 25E8 25E8 25E8 25E8 25E9 25EC 25EE 25F1 25F2 25F5 25F5 25F8 25F8 25F8 25F8 25FB 25FD 2601 2604 2605
E7 C3 FF
DF 23 E5 01 CD 20 CD 28 CD 28 F7 E1 D5 7E 23 12 13 FE 20 7E 23 FE 28 0B D1 21 CB CB C4 C3
00 0F 1B 0F FB 30 11
22 F8 22 F2 3B B6 7E B2 12
E7 CD FE C2 E7 C3
FB 29 8A 12
C3 BD
CD 28 ED CD EF A1
30 28 4B 2B
* *scitani '+' * rst GETNXT >CHADD< +1,dalsi znak 24 jp #24FF skok do hlavni rutiny * *textovy mod *zpracovava retezce (proste i vicenasobne),uzavrene uvozovkami * rst GETACT prevezme aktualni znak inc HL _HL nyni ukazuje na zacatek retezce push HL a je uschovano 00 ld BC,0 delka retezce nastavena na 0 25 call #250F hledany dvojite uvozovky jr NZ,#25D9 zadne nenalezeny 25 call #250F jinak hledany treti,pate,... jr Z,#25BE 25 call CHESYN pri kontrole syntaxe musi jr Z,#25D9 byt bit6 >FLAGS< nastaven rst REST30 pri behu pgmu je vyhrazeno misto pro retezec v uvozovkach pop HL obnoven ukazatel na zacatek retezce push DE uschova ukazatele na uvolneny prostor ld A,(HL) prevzat prvni znak retezce inc HL ukazatel +1 ld (DE),A a zapsan na vyhrazene misto inc DE ukazatel do volneho mista +1 cp '"' byly to uvozovky ? jr NZ,#25CB ne:dalsi ukladani ld A,(HL) nasleduji jeste jedny uvozovky ? inc HL (ukazatel +1,jedny uvozovky potlaci) cp '"' jr Z,#25CB ano:dalsi ukladani dec BC skutecna delka retezce pop DE pocatek retezce zpet do _DE 5C ld HL,FLAGS zde je vstupni bod pro pripad,ze res 6,(HL) je bit6 >FLAGS< nastaven pro retezec bit 7,(HL) pri behu pgmu 2A call NZ,#2AB2 retezec (udaje) ulozen na calcstack 27 jp #2712 dale prohledavan radek * *vstup pri otviraci zavorce * rst GETNXT >CHADD< +1,dalsi znak 24 call SCANN volana rutina pro vyhodnoceni vyrazu cp ')' existuje zavorka pro ukonceni ? 1C jp NZ,1C8A ne:chyba rst GETNXT jinak nasledujici znak 27 jp #2712 pro dalsi kontroly * 27 jp #27BD skok pro 'FN' * *vstup pri 'RND' * 25 call CHESYN pri kontrole syntaxe jr Z,#2625 se nahodne cislo nepropocitava 76 5C ld BC,(SEED) aktualni hodnota >SEED< 2D call #2D2B ulozena na calcstack rst CALSW volani kalkulatoru DEFB #A1 ulozi 1
2606 2607 2608 260A 260B 260C 2611 2612 2613 2614 2615 2616 2617 261A 261E 261F 2620 2622 2624 2625 2627 2627 2627 2627 262A 262C 262D 262E 262F 2630 2630 2631 2634 2634 2634 2634 2637 2638 263A 263D 2640 2642 2644 2646 2649 264B 264D 2650 2652 2652 2653 2654 2657 2658 265B 265C 265D 265E 2660 2662
0F 34 37 04 34 80 32 02 A1 03 31 38 CD ED 7E A7 28 D6 77 18
16 41 00 00
A2 2D 43 76 5C 03 10 09
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB call ld ld and jr sub ld jr
#0F #34 #37 #16 #04 #34 #80 #41 #00 #32 #02 #A1 #03 #31 #38 #2DA2 (SEED),BC A,(HL) A Z,#2625 #10 (HL),A #2630
pricte ji k >SEED< ulozi cislo =75 (SEED+1)*75 ulozi cislo #00 #80 =65537 (SEED+1)*75/65537 ;mod na zasobniku zustane zbytek deleni ulozi 1 zbytek-1 vysledek zduplikovan konec posledni hodnota pouzita jako nova do >SEED< precte exponent posledni hodnoty pokud je nulovy, pak skok jinak -16,to odpovida deleni 65536 exponent zapsan zpet
CD 30 25 28 04 EF A3 38 34 E7 C3 C3 26
01 E7 FE CA 21 CB CB 28 CD 0E 20 CD 30 15 5F CD F5 01 F7 F1 12 0E 06 CD
5A 10 23 0D 3B B6 7E 1F 8E 00 13 1E 0E 27 5C
02 03
33 03 01 00
01 00 B2 2A
* *ulozi cislo PI na zasobnik kalkulatoru * call CHESYN pri kontrole syntaxe jr Z,#2630 se nerealizuje rst CALSW jinak volan kalkulator DEFB #A3 polozi na calstack PI/2 DEFB #38 konec inc (HL) exponent+1 : 2*(PI/2) * rst GETNXT nacte dalsi znak jp #26C3 a pokracuje * *vstup pri 'INKEY$' * ld BC,#105A priorita #10, kod cteni #5A rst GETNXT dalsi znak cp '#' test na '#' jp Z,#270D ano:numericky argument ld HL,FLAGS jinak res 6,(HL) pozn:"retezec" bit 7,(HL) pri kontrole syntaxe jr Z,#2665 skok call #028E jinak kod znaku do _DE ld C,0 pozn:"prazdny retezec" jr NZ,#2660 je-li stlaceno vice klaves:skok call #031E testovani kodu klavesy jr NC,#2660 pri "nepouzitelnem" znaku jde na zasobnik prazdny retezec dec D _D=#FF ld E,A kod klavesy do _E call #0333 a dekodovan na ASCII push AF uschovani vysledku ld BC,1 jeden bajt pro vysledek rst REST30 rezervovan pop AF obnoven ASCII znak v _A ld (DE),A a zapsan ld C,1 delka retezce ld B,0 na 1 call #2AB2 retezec (udaje) na calcstack
2665 2668 2668 2668 2668 266B 266E 266F 2672 2672 2672 2672 2675 2678 2679 267B 267B 267B 267B 267E 2681 2682 2684 2684 2684 2684 2687 2689 268B 268D 268D 268D 268D 2690 2692 2692 2692 2692 2692 2695 2696 2699 269C 269D 269F 26A0 26A1 26A4 26A6 26A7 26A9 26AC 26AE 26AF 26B0 26B3 26B5 26B5 26B5 26B5
C3 12 27
CD 22 25 C4 35 25 E7 C3 DB 25
CD 22 25 C4 80 25 E7 18 48
CD 22 25 C4 CB 22 E7 18 3F
CD 30 FE 30
88 2C 56 41 3C
CD 30 25 20 23
CD DF 01 CD 23 36 23 EB 2A 0E A7 ED 22 ED EB 2B CD 18
9B 2C 06 00 55 16 0E 65 5C 05 42 65 5C B0 77 00 0E
DF
jp #2712 dalsi prohledavani * *vstup pri 'SCREEN$' * call #2522 test,zda obe souradnice call NZ,#2535 volano jen pri behu pgmu rst GETNXT dalsi znak jp #25DB a dalsi prohledavani * *vstup pri 'ATTR' * call #2522 test,zda obe souradnice call NZ,#2580 volano jen pri behu pgmu rst GETNXT dalsi znak jr #26C3 pozn:"numericky" * *vstup pri 'POINT' * call #2522 test,zda obe souradnice call NZ,#22CB volano jen pri behu pgmu rst GETNXT dalsi znak jr #26C3 pozn:"numericky" * *prezkouseni,zda se jedna o alfanumericky znak * call #2C88 alfanumericky ? jr NC,#26DF ne cp 'A' je to pismeno ? jr NC,#26C9 ano * *rutina pro zpracovani dekadickeho cisla (take po 'BIN') * call CHESYN kontrola syntaxe ? jr NZ,#26B5 ne * *pri zadani radku (resp. kontrole syntaxe) je cislo upraveno *na cislo v plovouci tecce a vrazeno do BASIC radku * call DECFLO uprava na cislo v plovouci tecce rst GETACT _HL ukazuje na posledni cislici +1 ld BC,6 cislo zabere 6 bajtu call MAKESP vytvoreni prostoru inc HL ukazatel na prvni rezervovane misto ld (HL),#0E zapsan kod "number" inc HL adresa nasledujiciho bajtu ex DE,HL prevedena do _DE ld HL,(STKEND) prevzeti stareho vrcholu zasobniku ld C,5 musi byt okopirovano 5 bajtu (_B=0) and A nulovani CARRY sbc HL,BC vypocet noveho vrcholu zasobniku ld (STKEND),HL a zapsani vysledku ldir cislo v plov.tecce prekopirovano ex DE,HL ukazatel do radku zpet (do _HL) dec HL a nastaven na posledni vlozeny bajt call #0077 nove nastaveni >CHADD< jr #26C3 pozn:"numericky" * *tato cast pracuje pri behu pgmu * rst GETACT _HL ukazuje na aktualni znak
26B6 26B7 26B8 26BA 26BC 26BD 26C0 26C3 26C3 26C7 26C9 26C9 26C9 26C9 26C9 26C9 26C9 26CC 26CF 26D2 26D2 26D5 26D7 26D9 26DA 26DD 26DF 26DF 26DF 26DF 26E2 26E4 26E6 26E6 26E9 26EB 26ED 26EF 26F2 26F5 26F7 26F9 26FC 26FC 26FC 26FC 26FE 2700 2701 2703 2705 2707 2709 270B 270D 270D 270D 270D 270D 270E
23 7E FE 20 23 CD 22
0E FA B4 33 5D 5C *
_HL +1 pro prevzeti dalsiho znaku hleda,dokud nenarazi na kod "number" _HL ukazuje na prvni bajt cisla cislo (v plov.tecce) na calcstack nove nastaveni >CHADD< pozn:"numericky vysledek" a dalsi prohledavani
FD CB 01 F6 18 14
CD B2 28 DA 2E 1C CC 96 29 3A FE 38 23 CD 18 3B 5C C0 04 B4 33 33
01 DB 09 FE 2D 28 27 01 FE 28 D6 DA 01 FE 28 D2 18 AE 20 AF 8A F0 14 14 8A 10
1C 04 1C
06 C6 4F FE 30 CB FE 38 CB
10 DC DF 02 B1 EE 02 B9
C5 E7
* *podpgm hleda promennou (ciselnou/retezcovou) v oblasti *promennych nebo pgmu *hodnota numericke promenne nebo parametry retezcove *budou preneseny na zasobnik kalkulatoru * call #28B2 hledani nazvu promenne jp C,#1C2E nenalezena:chyba call Z,#2996 polozi parametry retezce na calcstack nebo vyda pocatecni adresu numericke ld A,(FLAGS) cp #C0 test,zda numericka jr C,#26DD pokud ne:skok inc HL jinak musi byt promenna call #33B4 okopirovana na zasobnik kalkulatoru jr #2712 dalsi prohledavani * *v teto casti jsou otestovany ruzne operatory * ld BC,#09DB priorita 9, kod #DB cp '-' znamenko minus ? jr Z,#270D ano * ld BC,#1018 priorita 16, kod #18 cp #AE je to 'VAL$' ? jr Z,#270D ano sub #AF test na kod #AF(CODE)..#C3(NOT) jp C,#1C8A ne:chyba ld BC,#04F0 priorita 4, kod #F0 cp #14 je to 'NOT' ? jr Z,#270D ano jp NC,#1C8A kod neni v rozsahu:chyba * *zmena tokenu na operacni kody * ld B,#10 priorita 16 add #DC rozsah #DC..#EF ld C,A kopie do _C cp #DF vykryti 'CODE','VAL' a 'LEN' jr NC,#2707 zadny z nich:skok res 6,C pro vyse uvedene nulovan bit6 cp #EE 'STR$' nebo 'CHR$' ? jr C,#270D ne res 7,C ano:nastaven bit7 * *kod priority v _B a kod operace v _C jsou uschovany *jeste pred vyhodnocenim dalsi casti vyrazu * push BC oba kody uschovany rst GETNXT zvyseni >CHADD<, dalsi znak
270F 2712 2712 2712 2712 2713 2715 2717 271B 271D 2720 2721 2723 2723 2723 2723 2723 2725 2726 2729 272C 272E 272F 2732 2733 2734 2734 2735 2735 2736 2737 2739 273A 273D 273E 273E 2741 2742 2744 2746 2748 274A 274C 274D 2750 2752 2753 2755 2756 2757 2758 2759 275B 275B 275B 275B 275C 275F 2761 2764
C3 FF 24
jp #24FF pokracuje v testovani * *vyhledava ve vyrazu zavorky,konec atp. * DF rst GETACT aktualni znak FE 28 cp '(' je otviraci zavorka ? 20 0C jr NZ,#2723 ne FD CB 01 76 bit 6,(FLAGS) test,zda jde o numericky vyraz 20 17 jr NZ,#2734 ano:jde o vyraz v zavorkach CD 52 2A call #2A52 upravi parametry posledni polozky E7 rst GETNXT dalsi znak 18 F0 jr #2713 znovu test * *rutina pro vyhledani priority a operacniho kodu ruznych *operatoru (+,*,NOT ap.) * 06 00 ld B,0 do _BC vlozen originalni kod 4F ld C,A ktery bude zpracovan 21 95 27 ld HL,#2795 adresa tabulky operatoru CD DC 16 call LOOKTA a jeji prohledani 30 06 jr NC,#2734 kod nenalezen 4E ld C,(HL) jinak precteni kodu operace 21 ED 26 ld HL,#26ED adresa tabulky priorit -#C3 09 add HL,BC pricteni kodu operace 46 ld B,(HL) a ziskana priorita vlozena do _B * D1 pop DE prinese ze zasobniku predchozi operaci a jeji prioritu 7A ld A,D tato priorita B8 cp B je porovnana se soucasnou 38 3A jr C,#2773 soucasna je vyssi:skok A7 and A jsou obe priority 0 ? CA 18 00 jp Z,GETACT ano C5 push BC aktualni hodnota na zasobnik * 21 3B 5C ld HL,FLAGS 7B ld A,E predesly kod operace FE ED cp #ED je 'USR' ? 20 06 jr NZ,#274C ne CB 76 bit 6,(HL) 'USR' s cislem ? 20 02 jr NZ,#274C ano 1E 99 ld E,#99 posledni kod operace nove D5 push DE predchozi hodnota na zasobnik CD 30 25 call CHESYN probiha kontrola syntaxe ? 28 09 jr Z,#275B pokud ano:preskok,jinak 7B ld A,E kod operace do _A E6 3F and #3F maskovany bit6 a bit7 47 ld B,A kod operace = ofset kalkulatoru do _B EF rst CALSW volan kalkulator 3B DEFB #3B provede prislusnou operaci 38 DEFB #38 konec 18 09 jr #2764 * *druh posledni operace porovnan s aktualni * 7B ld A,E kod predchozi operace FD AE 01 xor (FLAGS) E6 40 and #40 zustane jen bit6 C2 8A 1C jp NZ,#1C8A musi byt nulovy,jinak chyba *
2764 2764 2764 2765 2768 276A 276C 276E 2770 2771 2773 2773 2773 2773 2773 2773 2773 2774 2775 2779 277B 277D 277F 2780 2782 2784 2786 2788 2788 278A 278A 278C 278E 2790 2790 2791 2792 2795 2795 2795 2795 2797 2799 279B 279D 279F 27A1 27A3 27A5 27A7 27A9 27AB 27AD 27AF 27B0 27B0 27B0 27B0 27B1 27B2
*druh predchazejici operace musi byt poznamenan do >FLAGS< * D1 pop DE kod predchazejici operace 21 3B 5C ld HL,FLAGS CB F6 set 6,(HL) implicitne pozn:"numericka" CB 7B bit 7,E predesla hodnota numericka ? 20 02 jr NZ,#2770 ano CB B6 res 6,(HL) jinak pozn:"retezcova" C1 pop BC soucasny kod operace do _BC 18 C1 jr #2734 * *pokud je soucasna priorita vyssi nez predesla,budou obe *operace ulozeny na zasobnik *pokud je nynejsi operace zpracovani retezce,je to *poznaceno primo do kodu operace * D5 push DE predchozi operace na zasobnik 79 ld A,C soucasna do _A FD CB 01 76 bit 6,(FLAGS) numericka ? 20 15 jr NZ,#2790 ano E6 3F and #3F retezcova:nulovan bit6 a bit7 C6 08 add 8 a prictena 8 4F ld C,A vysledek zpet do _C FE 10 cp #10 operace 'AND' ? 20 04 jr NZ,#2788 ne CB F1 set 6,C ano,pozn:"numericka" 18 08 jr #2790 * 38 D7 jr C,#2761 operace '-','*','/','^','OR' jsou pri retezci nepripustne FE 17 cp #17 operace '+' ? 28 02 jr Z,#2790 ano CB F9 set 7,C ostatni operace davaji numericky vysledek C5 push BC soucasna hodnota na zasobnik E7 rst GETNXT prevezme dalsi znak C3 FF 24 jp #24FF a pokracuje v testovani * *tabulka pro zmenu operatoru na kod operace * 2B CF DEFB '+' #CF scitani 2D C3 DEFB '-' #C3 odcitani 2A C4 DEFB '*' #C4 nasobeni 2F C5 DEFB '/' #C5 deleni 5E C6 DEFB '^' #C6 mocnina 3D CE DEFB '=' #CE prirazeni,rovnost 3E CC DEFB '>' #CC vetsi nez 3C CD DEFB '<' #CD mensi nez C7 C9 DEFB #C7 #C9 mensi nebo rovno ('<=') C8 CA DEFB #C8 #CA vetsi nebo rovno ('>=') C9 CB DEFB #C9 #CB nerovno,ruzne od ('<>') C5 C7 DEFB #C5 #C7 'OR' C6 C8 DEFB #C6 #C8 'AND' 00 DEFB #00 (konec tabulky) * *tabulka prislusnych priorit * 06 DEFB #06 08 DEFB #08 * 08 DEFB #08 /
27B3 27B4 27B5 27B6 27B7 27B8 27B9 27BA 27BB 27BC 27BD 27BD 27BD 27BD 27C0 27C2 27C3 27C6 27C9 27CA 27CC 27CD 27CF 27D0 27D2 27D4 27D5 27D7 27D9 27DC 27DD 27DF 27E1 27E2 27E4 27E4 27E6 27E9 27EA 27ED 27EF 27F0 27F2 27F4 27F7 27F7 27F7 27F7 27F8 27FA 27FB 27FC 27FE 27FF 2801 2802 2802 2803 2804 2807
0A 02 03 05 05 05 05 05 05 06
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB
#0A #02 #03 #05 #05 #05 #05 #05 #05 #06
CD 20 E7 CD D2 E7 FE F5 20 E7 FE 20 E7 FE 28 CD DF FE 20 E7 18 FE C2 E7 21 CB F1 28 CB C3
30 25 35 8D 2C 8A 1C 24 01 28 12 29 10 FB 24 2C 03 F5 29 8A 1C 3B 5C B6 02 F6 12 27
E7 E6 DF 47 E7 D6 24 4F 20 01 E7 E7 E5 2A 53 5C 2B
* *podpgm pro vytvoreni potrebne definovane funkce ('DEF FN') * call CHESYN beh pgmu ? jr NZ,#27F7 ano:skok rst GETNXT prevezme prvni znak nazvu call #2C8D je to pismeno ? jp NC,#1C8A ne:chyba rst GETNXT dalsi znak cp '$' jde o retezcovou funkci ? push AF (uschova ZERO) jr NZ,#27D0 ne rst GETNXT dalsi znak cp '(' musi byt zavorka jr NZ,#27E6 jinak chyba rst GETNXT dalsi znak cp ')' je uzaviraci zavorka ? jr Z,#27E9 ano:bez argumentu call SCANN jinak vyhodnoceni vyrazu (syntaxe) rst GETACT znak za vyrazem cp ',' je carka ? jr NZ,#27E4 ne:bez dalsich argumentu rst GETNXT jinak prevzeti dalsiho znaku jr #27D9 a definice dale testovana * cp ')' je argument uzavren ? jp NZ,#1C8A ne:chyba rst GETNXT >CHADD< +1 ld HL,FLAGS res 6,(HL) pozn:retezcova funkce pop AF obnoveni ZERO (z radku #27CC) jr Z,#27F4 skok pri retezcove funkci set 6,(HL) jinak pozn:numericka jp #2712 dalsi kontrola radku * *vstup pro funkci pri behu pgmu * rst GETNXT prvni pismeno nazvu and #DF pripadna uprava na velke pismeno ld B,A kopie do _B rst GETNXT dalsi znak sub '$' je oznaceni retezcove ? ld C,A retezcova:_C=0,numericka:_C<>0 jr NZ,#2802 skok pri numericke rst GETNXT ignorovana zavorka * rst GETNXT prvni znak prvniho argumentu push HL uschova ukazatele do radku ld HL,(PROG) pocatek BASIC pgmu dec HL -1 pro vyhledavaci rutinu
2808 280B 280C 280F 2810 2812 2812 2813 2814 2814 2815 2815 2818 281A 281B 281D 2820 2822 2823 2825 2826 2827 282A 282B 282E 282F 2831 2831 2831 2831 2832 2835 2836 2837 283B 283E 283F 2841 2843 2844 2845 2847 2849 284B 284C 284F 2850 2852 2852 2853 2854 2855 2858 2859 285C 285E 2860 2861 2862 2865
11 CE 00 C5 CD 86 1D C1 30 02 * CF 18 * E5 CD E6 B8 20 CD D6 B9 28 E1 2B 11 C5 CD C1 18 AB 28 DF 08 AB 28 24 0C 00 02 8B 19 D7
bude hledano 'DEF FN' uschova jmena a druhu funkce prohledani pgmu obnoveni jmena a druhu pokud nalezeno:skok jinak hlaseni 'FN without DEF' ukazatel na 'DEF FN' pro dalsi pripadne hledani uschovan prinese jmeno funkce vzdy velke pismeno souhlasi toto jmeno ? ne:dalsi hledani prevezme dalsi znak a testuje na '$' (pro retezcovou _C=0) druh funkce souhlasi ukazatel zpet na 'DEF FN' -1 pro dalsi hledani hodnota pro vyhledavaci rutinu uschova jmena a druhu nalezeni konce prikazu 'DEF FN' obnoveni jmena a druhu dalsi hledani v pgmu
rst ERROUT DEFB #18 push HL call and cp jr call sub cp jr pop dec ld push call pop jr #28AB #DF B NZ,#2825 #28AB '$' C Z,#2831 HL HL DE,#0200 BC #198B BC #2808
* *byl nalezen spravny prikaz 'DEF FN' * A7 and A pri retezci (_HL ukazuje na '$') CC AB 28 call Z,#28AB vyhledani otviraci zavorky D1 pop DE odstranen ukazatel na 'DEF FN' D1 pop DE obnoven ukazatel na prvni argument ED 53 5D 5C ld (CHADD),DE a zapsan do >CHADD< CD AB 28 call #28AB preskoci otviraci zavorku E5 push HL a ukazatel za ni uschovan FE 29 cp ')' kdyz je dalsi znak ')',nema 28 42 jr Z,#2885 funkce argument:skok 23 inc HL ukazuje na dalsi znak 7E ld A,(HL) prevezme jej FE 0E cp #0E a testuje na "number" 16 40 ld D,#40 do bitu6 pozn:numericka 28 07 jr Z,#2852 a je-li numericka:skok 2B dec HL _HL opet ukazuje na otviraci zavorku CD AB 28 call #28AB tato je preskocena 23 inc HL a ukazuje na dalsi znak 16 00 ld D,0 pozn:retezcova * 23 inc HL ukazatel na prvni z 5 bajtu E5 push HL uschovan D5 push DE ulozen druh funkce CD FB 24 call SCANN vyhodnocen argument F1 pop AF druh funkce obnoven v _A FD AE 01 xor (FLAGS) a porovnany E6 40 and #40 bity6 20 2B jr NZ,#288B nesouhlasi:chyba E1 pop HL ukazatel na prvni bajt EB ex DE,HL prenesen do _DE 2A 65 5C ld HL,(STKEND) konec calcstacku 01 05 00 ld BC,5 (misto pro 5 bajtu cisla)
2868 286A 286D 286F 2870 2871 2874 2876 2878 2879 287A 287C 287E 287F 2880 2883 2885 2885 2886 2887 2889 288B 288B 288C 288D 288D 288E 288F 2892 2895 2896 2899 289A 289B 289C 289F 28A0 28A3 28A4 28A7 28A8 28AB 28AB 28AB 28AB 28AB 28AC 28AD 28AF 28B1 28B2 28B2 28B2 28B2 28B2 28B6 28B7 28BA 28BD 28BE
ED 22 ED EB 2B CD FE 28 E5 DF FE 20 E7 E1 CD 18
42 65 5C B0 AB 28 29 0D 2C 0D AB 28 BE *
sbc ld ldir ex dec call cp jr push rst cp jr rst pop call jr push rst cp jr *
HL,BC posunut (STKEND),HL a zapsan zpet vysledek vyrazu za 'DEF FN' prenesen DE,HL _HL na posledni znak HL vyrazu #28AB a nyni na prvni znak za nim ')' je to uzav.zavorka ? Z,#2885 ano:bez dalsich argumentu HL jinak znovu uschovan ukazatel GETACT prevzat aktualni znak "," je to carka pred dalsim argumentem ? NZ,#288B ne:parametr nesouhlasi:chyba GETNXT >CHADD< +1 HL _HL ukazuje na carku #28AB vyhledani dalsiho argumentu #2843 a jeho zpracovani HL GETACT ')' Z,#288D uschova ukazatele na zavorku znovu aktualni znak skutecne je to zavorka ? ano:vse O.K. jinak hlaseni 'Parameter error' ukazatel na ')' do _HL a zapsan stara adresa argumentu stara hodnota uschovana a nova zapsana ukazatel na ')' uschovan >CHADD< +2 pro preskoceni ')' a rovnitka funkce vyhodnocena ukazatel na ')' zapsan zpet obnovena stara hodnota >DEFADD< a zapsana >CHADD< +1 a dale BASICovym radkem
E5 DF FE 29 28 02 CF 19 * D1 EB 22 2A E3 22 D5 E7 E7 CD E1 22 E1 22 E7 C3 5D 5C 0B 5C 0B 5C
rst ERROUT DEFB #19 pop ex ld ld ex ld push rst rst call pop ld pop ld rst jp DE DE,HL (CHADD),HL HL,(DEFADD) (SP),HL (DEFADD),HL DE GETNXT GETNXT SCANN HL (CHADD),HL HL (DEFADD),HL GETNXT #2712
FB 24 5D 5C 0B 5C 12 27
* *rutina pro preskoceni mezery a ridicich znaku jen *v _HL, >CHADD< musi zustat zachovano * 23 inc HL ukazatel +1 7E ld A,(HL) aktualni znak FE 21 cp '!' mezera a ridici znaky 38 FA jr C,#28AB jsou preskoceny (ignorovany) C9 ret * *podpgm pro vyhledani promenne *hleda v oblasti promennych prip.v argumentech 'DEF FN' * FD CB 01 F6 set 6,(FLAGS) implic.pozn:numericka DF rst GETACT prevezme aktualni znak CD 8D 2C call #2C8D a testuje na pismeno D2 8A 1C jp NC,#1C8A neni to pismeno:chyba E5 push HL uschova ukazatele na pismeno E6 1F and #1F jen bit0..bit4
28C0 28C1 28C2 28C3 28C5 28C7 28C9 28CB 28CD 28CF 28D2 28D4 28D4 28D4 28D4 28D7 28D9 28DB 28DC 28DE 28DE 28DF 28E3 28E3 28E3 28E3 28E3 28E3 28E6 28E7 28E9 28EC 28EF 28EF 28F0 28F3 28F5 28F6 28F8 28FA 28FB 28FD 28FD 28FD 28FD 2900 2901 2903 2905 2906 2908 2909 290A 290D 290F 290F 290F 290F 2910 2911
4F E7 E5 FE 28 CB FE 28 CB CD 30
28 28 F1 24 11 E9 88 2C 0F
C,A GETNXT HL '(' Z,#28EF 6,C '$' Z,#28DE 5,C #2C88 NC,#28E3
predany do _C dalsi znak a ukazatel na nej uschovan otviraci zavorka ? ano:je to pole impl.pozn:prosty nazev je to retezec (retezcove pole) ? ano pozn:numericka promenna je znak pismeno ? ne:prosty nazev (jednopismenny)
* *hledani posledniho znaku nazvu promenne * CD 88 2C call #2C88 pismeno ? 30 16 jr NC,#28EF ne,nalezen konec CB B1 res 6,C pozn:dlouhy nazev E7 rst GETNXT dalsi znak 18 F6 jr #28D4 a pokracuje v hledani * E7 rst GETNXT >CHADD> +1,zde na '$' FD CB 01 B6 res 6,(FLAGS) pro retezce (i pole) zpetne nastaven rozlisovaci bit * *kdyz je MSB >DEFADD< nenulovy (zn:DEF FN) a bezi pgm,probehne *vyhledani argumentu 'DEF FN' * 3A 0C 5C ld A,(DEFADD+1) MSB >DEFADD< A7 and A testovan na 0 28 06 jr Z,#28EF nejde o 'DEF FN' CD 30 25 call CHESYN kontrola syntaxe ? C2 51 29 jp NZ,#2951 ne,tedy beh pgmu * 41 ld B,C bajt "druhu" okopirovan do _B CD 30 25 call CHESYN kontrola syntaxe ? 20 08 jr NZ,#28FD ne 79 ld A,C v bajtu "druh funkce" E6 E0 and #E0 odstraneny bity nazvu CB FF set 7,A pozn:kontrola syntaxe 4F ld C,A a kopie do _C 18 37 jr #2934 * *pri vykonu pgmu probehne hledani promenne v oblasti "VARS" * 2A 4B 5C ld HL,(VARS) ukazatel na zacatek oblasti 7E ld A,(HL) porovnan nazev E6 7F and #7F pouze v bitech 0..6 28 2D jr Z,#2932 pri nalezeni koncove znacky (#80) B9 cp C souhlasi nazev ? 20 22 jr NZ,#292A ne 17 rla _A krat 4 pro 87 add A testovani bitu5 a bitu6 F2 3F 29 jp P,#293F retezec nebo pole 38 30 jr C,#293F prosta nebo 'FOR'-'NEXT' promenna * *dlouhe jmeno provereno cele * D1 pop DE ukazatel na druhy znak D5 push DE (ponechan na zasobniku) E5 push HL uschovan ukazatel na prvni znak
2912 2913 2914 2915 2917 2919 291B 291C 291E 2920 2921 2923 2924 2927 2929 2929 2929 2929 2929 2929 292A 292B 292E 292F 2930 2932 2932 2934 2934 2934 2934 2935 2936 2938 293A 293C 293E 293E 293E 293E 293F 293F 2940 2941 2942 2943 2946 2948 2949 294B 294B 294C 294E 2950 2951 2951 2951 2951 2951 2954
23 1A 13 FE 28 F6 BE 28 F6 BE 20 1A CD 30
20 FA 20 F4 80 06 88 2C 15
HL A,(DE) DE ' ' Z,#2913 #20 (HL) Z,#2912 #80 (HL) NZ,#2929 A,(DE) #2C88 NC,#293E
kazdy znak postupne prevzat pro porovnani mezery jsou ignorovany vzdy na male pismeno porovnani souhlasi jinak test,zda je to posledni pismeno nazvu ne:porovnani dalsi promenne posledni znak znovu prevzat a testovan na pismeno nalezena spravna promenna
E1 C5 CD B8 19 EB C1 18 CE CB F8
D1 DF FE 28 CB 18
28 09 E8 0D
D1 D1 D1 E5 DF CD 88 2C 30 03 E7 18 F8 E1 CB 10 CB 70 C9
2A 0B 5C 7E
* *kdyz nazev nesouhlasi,musi byt v oblasti promennych *nalezen zacatek dalsi *_HL je ukazatel na ni * pop HL ukazatel obnoven push BC uschova registru call #19B8 hledani dalsi promenne ex DE,HL ukazatele musi byt prehozeny pop BC obnova _BC jr #2900 zpet na porovnavani * set 7,B pozn:promenna nenalezena * *pri kontrole syntaxe * pop DE ukazatel na druhy znak rst GETACT prevzeti aktualniho znaku cp '(' otviraci zavorka (pro pole) ? jr Z,#2943 ano set 5,B jinak pozn:"ne pole" jr #294B * *byl nalezen spravny nazev * pop DE pri dlouhem jmenu zruseno o jeden ukazatel vice nez pri normalnim pop DE zruseni ukazatele na druhy pop DE a na prvni znak push HL uschovan ukazatel na posledni znak rst GETACT aktualni znak call #2C88 a jeste jednou preskocen nazev jr NC,#294B toto probehne pres rst GETNXT celou oblast ! jr #2943 * pop HL ukazatel na posledni znak nazvu rl B rotace pro nastaveni _F bit 6,B test (puvodne bit5=oznaceni pole) ret * *podpgm uklada argument 'DEF FN' na zasobnik kalkulatoru *je volan rutinou pro vyhledani promenne * ld HL,(DEFADD) ukazuje na prvni znak argumentu ld A,(HL) prevzeti znaku
2955 2957 295A 295A 295B 295D 295E 295F 2960 2962 2964 2965 2968 2969 296B 296B 296C 296D 296F 2970 2971 2972 2973 2974 2977 2979 297C 297F 2981 2981 2983 2985 2986 298A 298D 298E 2991 2992 2993 2994 2995 2996 2996 2996 2996 2996 2997 2998 299A 299C 299E 29A0 29A1 29A2 29A3 29A4 29A5 29A6 29A7 29AA
FE 29 CA EF 28 * 7E F6 47 23 7E FE 28 2B CD 23 CB 78 B9 28 23 23 23 23 23 CD FE CA CD 18 CB 20 23 ED CD EB 22 D1 D1 AF 3C C9 60
cp jp ld or ld inc ld cp jr dec call inc res * ld cp jr inc inc inc inc inc call cp jp call jr * bit jr inc ld call ex ld pop pop xor inc ret
')' Z,#28EF A,(HL) #60 B,A HL A,(HL) #0E Z,#296B HL #28AB HL 5,B A,B C Z,#2981 HL HL HL HL HL #28AB ')' Z,#28EF #28AB #295A 5,C NZ,#2991 HL DE,(STKEND) #33C0 DE,HL (STKEND),HL DE DE A A
pokud je to zavorka pak hleda v oblasti promennych prvni argument (=prosta numericka promenna) prenesen do _B dalsi znak prevzat kod "number" ? ano pro retezec zajisti aby _HL ukazovalo na znak za '$' pozn:retezcova promenna druh a typ promenne porovnan s hledanou souhlasi:nalezena jinak musi _HL preskocit 5 bajtu vyjadreni promenne nebo parametru retezce najde dalsi znak pokud je to zavorka pak hledani v oblasti promennych jinak _HL na dalsi argument a pokracuje v hledani numericky argument ? ano ukazuje na 1. z 5 bajtu na calcstacku konec zasobniku kalkulatoru polozi 5 bajtu na calcstack a zapise novou hodnotu konce odstraneni ukazatelu prohledavaci rutiny smazani CARRY a ZERO timto pozn:neni treba jiz nic ukladat
0E 07 AB 28 A8
12
AB 28 29 EF 28 AB 28 D9 69 0C 5B 65 5C C0 33 65 5C
AF 47 CB 20 CB 20 3C 23 4E 23 46 23 EB CD DF
79 4B 7E 0E
B2 2A
* *podpgm pro vyhledani parametru retezce v oblasti promennych *nebo nalezeni bazove adresy pole * xor A smazanim pozn:pole ld B,A nulovani _B bit 7,C kontrola syntaxe ? jr NZ,#29E7 ano bit 7,(HL) pole ? jr NZ,#29AE ano inc A pozn:normalni retezec inc HL preskoci nevyznamny bajt ld C,(HL) LSB delky inc HL ld B,(HL) cela delka v _BC inc HL ex DE,HL ukazatel na adresu do _DE call #2AB2 _A.._E ulozi na calcstack rst GETACT a s aktualnim znakem
29AB 29AE 29AE 29AF 29B0 29B1 29B2 29B4 29B6 29B7 29B7 29B9 29BA 29BB 29BD 29BF 29C0 29C1 29C3 29C3 29C3 29C3 29C3 29C3 29C3 29C4 29C5 29C6 29C8 29CA 29CC 29CE 29D0 29D2 29D4 29D6 29D7 29D8 29DA 29DC 29DC 29DE 29E0 29E1 29E2 29E5 29E7 29E7 29E7 29E7 29EA 29EB 29EC 29ED 29EE 29F0 29F2 29F3 29F5 29F7
C3 49 2A * 23 23 23 46 CB 71 28 0A 05 28 EB DF FE 20 EB EB 18 E8 28 61 24
#2A49 HL HL HL B,(HL) 6,C Z,#29C0 B Z,#29A1 DE,HL GETACT '(' NZ,#2A20 DE,HL DE,HL #29E7
dale stanoveni bazove adresy prvku pole preskokem bajtu s delkou prevzeti dimenze ciselne pole ? ano jednorozmerne retezcove pole se muze brat jako normalni retezec v tom pripade:skok ukazatel uschovan do _DE prevzeti aktualniho znaku kdyz to neni zavorka pak chyba ukazatel je v _DE
E5 DF E1 FE 28 CB 28 CB 20 FE 20 E7 C9 FE 28 FE 20 DF 2B 22 18
2C 20 79 52 71 06 29 3C 29 6C CC 32 5D 5C 5E
21 E5 E7 E1 79 FE 20 DF FE 28 FE
00 00
C0 09 29 51 CC
* *smycka pro vyhledani parametru prvku pole *_B pracuje jako pocitadlo dimenzi *retezcova pole maji o rozmer mene,protoze posledni udaj *se bere jako udani useku retezce * push HL uschova pocitadla rst GETACT aktualni znak pop HL (obnoveni pocitadla) cp ',' pokud je to carka jr Z,#29EA skok na zpracovani dalsiho indexu bit 7,C kontrola syntaxe ? jr Z,#2A20 ne:chyba bit 6,C retezcove pole ? jr NZ,#29D8 ano cp ')' pokud popis indexu jr NZ,#2A12 nekonci zavorkou:chyba rst GETNXT jinak >CHADD< +1 ret cp ')' uzaviraci zavorka ? jr Z,#2A48 ano prosetreni dalsiho indexu cp #CC je to token 'TO' ? jr NZ,#2A12 ne:chyba rst GETACT >CHADD< do _HL dec HL o jeden znak zpet ld (CHADD),HL tato hodnota do >CHADD< jr #2A45 * *obvykly vstupni bod do teto rutiny * ld HL,0 nulovani pocitadla push HL a jeho ulozeni rst GETNXT >CHADD< +1 pop HL obnoveni pocitadla ld A,C popisny bajt do _A cp #C0 ko.syntaxe pro pole nabo retezec ? jr NZ,#29FB ne rst GETACT prevzat aktualni znak cp ")" a testovan na zavorku jr Z,#2A48 ano:prvky jsou v poradku cp #CC token 'TO' ?
29F9 29FB 29FB 29FC 29FD 2A00 2A01 2A02 2A05 2A07 2A08 2A08 2A0B 2A0C 2A0D 2A0E 2A10 2A10 2A12 2A14 2A15 2A17 2A19 2A1A 2A1B 2A1C 2A1E 2A20 2A20 2A21 2A22 2A22 2A23 2A24 2A27 2A2A 2A2B 2A2C 2A2C 2A2C 2A2C 2A2F 2A30 2A30 2A33 2A34 2A35 2A36 2A37 2A38 2A39 2A3C 2A3D 2A3F 2A41 2A43 2A45 2A48 2A49 2A4B
28 E5 * C5 E5 CD EE 2A E3 EB CD CC 2A 38 19 0B CD F4 2A 09 D1 C1 10 B3 * CB 20 E5 CB 20 42 4B DF FE 28 CF 02 * E7 E1 11 05 00 CD F4 2A 09 C9 79 66 71 13
jr push push call ex ex call jr dec call add pop pop djnz bit jr push bit jr ld ld rst cp jr *
Z,#29E0 BC HL #2AEE (SP),HL DE,HL #2ACC C,#2A20 BC #2AF4 HL,BC DE BC #29C3 7,C NZ,#2A7A HL 6,C NZ,#2A2C B,D C,E GETACT ')' Z,#2A22
ano:zpracovani useku retezce uschova pocitadla "DIM",popisneho bajtu a pocitadla prvku vetsi rozmer do _DE pocitadlo<->ukazatel na promennou pocitadlo do _DE,v.rozmer do _HL prosetren "popis" dalsiho prvku neni v mezich:chyba pocitadlo -1,protoze prvek pred hledanym musi byt odecten pocitadlo*DIM (_HL*_DE) pricteno cislo prvku obnoven ukazatel na promennou obnoveni rozmeru a popisneho bajtu opakovani do _B=0 pokud kontrola syntaxe pak chyba uschova pocitadla retezcove pole ? ano ukazatel na promennou do _BC aktualni znak musi byt zavorka,jinak hlaseni 'subscript wrong' >CHADD< +1 obnoveni pocitadla 5 bajtu pro kazdy prvek pole spocita potrebny pocet bajtu a _HL ukazuje pred hledany prvek
29 02
rst ERROUT DEFB #02 rst pop ld call add ret GETNXT HL DE,5 #2AF4 HL,BC
CD EE 2A E3 CD C1 09 23 42 4B EB CD DF FE 28 FE 20 CD E7 FE 28 F4 2A
B1 2A 29 07 2C DB 52 2A 28 F8
* *dalsi zpracovani retezcoveho pole * call #2AEE posledni nejvetsi rozmer do _DE ex (SP),HL ukazatel na promennou ulozen a pocitadlo do _HL call #2AF4 spocita:pocitadlo*nejvetsi rozmer pop BC ukazatel na promennou obnoven v _BC add HL,BC _HL ukazuje inc HL na zacatek retezce ld B,D posledni nejv.rozmer jako delka ld C,E do _BC ex DE,HL zacatek retezce do _DE call #2AB1 tento udaj ulozen na calcstack rst GETACT aktualni znak cp ')' je tato cast hotova ? jr Z,#2A48 ano cp ',' ne:musi tam byt carka jr NZ,#2A20 jinak chyba call #2A52 modifikace parametru rst GETNXT dalsi znak, >CHADD< +1 cp '(' pokud je tam otviraci zavorka jr Z,#2A45 musi byt proverena dalsi cast
2A4D 2A51 2A52 2A52 2A52 2A52 2A55 2A58 2A59 2A5B 2A5D 2A5E 2A5F 2A60 2A61 2A64 2A65 2A66 2A68 2A6A 2A6B 2A6E 2A6E 2A6F 2A70 2A71 2A72 2A73 2A74 2A76 2A78 2A7A 2A7D 2A7D 2A7D 2A7D 2A7E 2A7F 2A81 2A81 2A82 2A83 2A84 2A86 2A88 2A89 2A8C 2A8D 2A8E 2A8F 2A90 2A92 2A94 2A95 2A96 2A97 2A98 2A99 2A9A 2A9C
FD CB 01 B6 C9
res 6,(FLAGS) ret * *podpgm pro * call call rst cp jr push xor push push ld rst pop cp jr pop call push ld ld push rst pop cp jr cp jp
pozn:retezcovy vysledek
zpracovani casti retezce CHESYN NZ,#2BF1 GETNXT ')' Z,#2AAD DE A AF BC DE,1 GETACT HL #CC Z,#2A81 AF #2ACD AF D,B E,C HL GETACT HL #CC Z,#2A81 ')' NZ,#1C8A kontrola syntaxe ? ne:prevzat parametr z calcstacku dalsi znak pokud zavorka,pak je udaj jen '()':skok uschova pocatecni adresy _A=0 uschovan _A a delka nastaven na 1.pismeno prevzat prvni znak delka do _HL je to token 'TO' ? ano (1.parametr=1) obnoven _A 1.parametr do _BC; _A obsahuje #FF, pokud byly prekroceny meze uschova _A prvni parametr okopirovan do _DE uschovana delka prevzat aktualni znak delka v _HL obnovena token 'TO' ? ano ne:musi to byt uzav.zavorka jinak chyba
CD C4 E7 FE 28 D5 AF F5 C5 11 DF E1 FE 28 F1 CD F5 50 59 E5 DF E1 FE 28 FE C2
30 25 F1 2B 29 50
01 00 CC 17 CD 2A
CC 09 29 8A 1C
62 6B 18 13 E5 E7 E1 FE 28 F1 CD F5 DF 60 69 FE 20 F1 E3 19 2B E3 A7 ED 01
29 0C CD 2A
29 E6
52 00 00
* *zde je zpracovan jednotlivy znak retezce - napr. C$(7) * ld H,D parametr do _DE ld L,E jr #2A94 * push HL uschova delky rst GETNXT dalsi znak pop HL obnoveni delky v _HL cp ')' pokud zavorka,byl dan jr Z,#2A94 jen jeden parametr pop AF obnoven A_ call #2ACD druhy parametr do _BC push AF uschovan _A (=#FF:chyba) rst GETACT prevzeti aktualniho znaku ld H,B kopie druheho parametru do _HL ld L,C cp ')' musi to byt zavorka jr NZ,#2A7A jinak chyba pop AF obnoveni znacky chyby v _A ex (SP),HL uschovan 2.parametr,zacatek do _HL add HL,DE 1.parametr pricten k zacatku dec HL -1 na 1.znak casti retezce ex (SP),HL ukaz.uschovan,obnoven druhy parametr and A nulovani CARRY sbc HL,DE 2. minus 1. parametr je delka ld BC,0 nova delka =0
2A9F 2AA1 2AA2 2AA3 2AA6 2AA7 2AA8 2AA9 2AAD 2AB0 2AB1 2AB1 2AB1 2AB1 2AB1 2AB1 2AB1 2AB2 2AB6 2AB7 2ABA 2ABB 2ABE 2ABF 2AC0 2AC1 2AC2 2AC3 2AC4 2AC5 2AC6 2AC7 2AC8 2ACB 2ACC 2ACC 2ACC 2ACC 2ACC 2ACC 2ACD 2ACE 2ACF 2AD0 2AD3 2AD4 2AD7 2AD9 2ADA 2ADD 2ADE 2ADF 2AE0 2AE1 2AE3 2AE3 2AE4 2AE5 2AE6 2AE8
38 23 A7 FA 44 4D D1 FD CD C8
07 20 2A
CB 01 B6 30 25
misto zaporne delky nulova korekce delky prekroceni rozmeru ? ano:chyba jinak nova delka do _BC zacatek prvniho znaku useku pozn:retezcovy vysledek kontrola syntaxe ? ano:navrat
* *podpgm ulozi parametry obsazene v _A.._E na calcstack *_A=0 oznacuje retezec z pole nebo usek retezce *_A=1 signalizuje prosty retezec,jehoz stara hodnota muze *byt odstranena * AF xor A pozn:retezec z pole nebo usek retezce FD CB 01 B6 res 6,(FLAGS) pozn:retezcovy vysledek C5 push BC CD A9 33 call SPACE5 test,zda je jeste volnych 5 bajtu C1 pop BC 2A 65 5C ld HL,(STKEND) konec calcstacku=1.volne misto 77 ld (HL),A parametry postupne zapsany 23 inc HL 73 ld (HL),E zacatek retezce 23 inc HL 72 ld (HL),D 23 inc HL 71 ld (HL),C delka retezce 23 inc HL 70 ld (HL),B 23 inc HL 22 65 5C ld (STKEND),HL nova hodnota C9 ret * *podpgm pro nacteni celeho cisla do _BC *vysledek nesmi prevysit hodnotu _HL,jinak chyba *oznaceni chyby v _A (=#FF:chyba) * AF xor A pozn:bez chyby D5 push DE uschova registru E5 push HL F5 push AF CD 82 1C call #1C82 vyhodnoti vyraz, prenese na calcstack F1 pop AF obnovi oznaceni chyby CD 30 25 call CHESYN pokud jde o kontrolu syntaxe 28 12 jr Z,#2AEB je zbytek preskocen F5 push AF uschova oznaceni chyby CD 99 1E call INTEG2 posledni hodnota z calcstacku do _BC D1 pop DE oznaceni chyby do _D 78 ld A,B pokud vysledek vyrazu je 0, B1 or C 37 scf pak nastaveni CARRY 28 05 jr Z,#2AE8 znaci chybu * E1 pop HL do _HL limit pro test E5 push HL (ale ponechan na zasobniku) A7 and A smazani CARRY ED 42 sbc HL,BC porovnani; bez chyby:CARRY nulove 7A ld A,D chybova znacka zpet do _A
2AE9 2AEB 2AEB 2AEC 2AED 2AEE 2AEE 2AEE 2AEE 2AEF 2AF0 2AF1 2AF2 2AF3 2AF4 2AF4 2AF4 2AF4 2AF7 2AF8 2AFB 2AFE 2AFF 2AFF 2AFF 2AFF 2AFF 2B02 2B06 2B08 2B08 2B0B 2B0C 2B0D 2B0E 2B10 2B12 2B14 2B16 2B18 2B1A 2B1C 2B1D 2B1F 2B1F 2B22 2B24 2B26 2B29 2B29 2B29 2B29 2B29 2B2A 2B2D 2B2E 2B31 2B32 2B33 2B34
DE 00 E1 D1 C9
* *tento podpgm nacte do _DE obsah (_DE+1),(_DE+2) * EB ex DE,HL adresa do _HL 23 inc HL +1 (tzn. _DE+1) 5E ld E,(HL) 23 inc HL +1 (tzn. _DE+2) 56 ld D,(HL) C9 ret * *podpgm vynasobi _HL*_DE a zjisti,zda vysledek v _HL >65536 * CD 30 25 call CHESYN pri kontrole syntaxe C8 ret Z se nic nepocita CD A9 30 call #30A9 provede nasobeni DA 15 1F jp C,#1F15 >#FFFF:chyba 'out of memory' C9 ret (pouziva se pro stanoveni adresy) * *prikaz 'LET' *provadi prirazeni pri 'LET','READ' a 'INPUT' * 2A 4D 5C ld HL,(DEST) soucasna cilova adresa promenne FD CB 37 4E bit 1,(FLAGX) promenna jiz existuje ? 28 5E jr Z,#2B66 ano * 01 05 00 ld BC,5 implicitne numericka 03 inc BC +1 pro kazdy znak nazvu 23 inc HL 7E ld A,(HL) prevezme znak FE 20 cp ' ' pritom ignoruje mezery 28 FA jr Z,#2B0C 30 0B jr NC,#2B1F skok pri _A=#21..#FF FE 10 cp #10 #00..#0F je povoleno jako 38 11 jr C,#2B29 koncovy kod FE 16 cp #16 totez plati pro #16..#1F 30 0D jr NC,#2B29 23 inc HL #10..#15 je ignorovano 18 ED jr #2B0C * CD 88 2C call #2C88 test na alfanumericky znak 38 E7 jr C,#2B0B ano:dalsi znak pro dlouhy nazev FE 24 cp '$' nebo jde o oznaceni retezce ? CA C0 2B jp Z,#2BC0 ano * *pro novou numerickou promennou bude zapotrebi _BC bajtu *(pro nazev a hodnotu),do nichz bude promenna okopirovana * 79 ld A,C delka do _A 2A 59 5C ld HL,(ELINE) nastaveni _HL na konec 2B dec HL oblasti promennych (na znacku #80) CD 55 16 call MAKESP vytvoreni prostoru pro promennou 23 inc HL 23 inc HL ukazuje na druhy novy bajt EB ex DE,HL tento ukazatel do _DE D5 push DE a uschovan
2B35 2B38 2B39 2B3B 2B3C 2B3E 2B3E 2B3F 2B40 2B42 2B44 2B46 2B47 2B48 2B4A 2B4A 2B4C 2B4D 2B4F 2B52 2B53 2B55 2B56 2B59 2B59 2B59 2B5A 2B5B 2B5C 2B5D 2B5E 2B61 2B62 2B64 2B66 2B66 2B66 2B66 2B6A 2B6C 2B6C 2B6C 2B6C 2B6F 2B70 2B72 2B72 2B72 2B72 2B75 2B79 2B7D 2B7F 2B7F 2B7F 2B7F 2B80 2B81 2B82 2B83
2A 4D 5C 1B D6 06 47 28 11 * 23 7E FE 38 F6 13 12 10 F6 12 3E 2A AE F6 E1 CD 21 FA 20 F4 * 80 C0 4D 5C 20 EA 2B * E5 EF 02 38 E1 01 05 00 A7 ED 42 18 40
ld dec sub ld jr inc ld cp jr or inc ld djnz or ld ld ld xor or pop call push rst DEFB DEFB pop ld and sbc jr
HL,(DEST) DE 6 B,A Z,#2B4F HL A,(HL) '!' C,#2B3E #20 DE (DE),A #2B3E #80 (DE),A A,#C0 HL,(DEST) (HL) #20 HL #2BEA HL CALSW #02 #38 HL BC,5 A HL,BC #2BA6
ukazatel na zacatek nazvu _DE ukazuje na prvni novy bajt pocet znaku jmena -1 do _B vysledek nulovy:jednopism.nazev dalsi znak nazvu nacita pricemz ignoruje rozsah #00..#20 vsechny upravi na mala pismena posun ukazovatka a zapis pismena pro cely nazev (dokud _B<>0) bit7=1 tim oznaci posledni pismeno znacka pro dlouhy nazev adresa prvniho pismena exor s 1.znakem a 0:kratky/#C0:dlouhy nazev;popr.uprava na male pismeno (odstranen ukazatel na druhy znak) toto pismeno zapsano a _HL nastaveno na novou koncovou znacku (#80) uschova ukazatele na posl.bajt a kalkulator smaze posledni polozku na calcstacku obnoveni ukazatele delka vyjadreni cisla smazani CARRY _HL ukazuje na prvni z petice bajtu skok na preneseni hodnoty
* *zpracovani jiz existujici promenne * FD CB 01 76 bit 6,(FLAGS) retezcova ? 28 06 jr Z,#2B72 ano * *stara hodnota promenne bude prepsana novou,proto korekce _HL * 11 06 00 ld DE,6 pricteni 6, aby 19 add HL,DE _HL ukazovalo za promennou 18 E7 jr #2B59 dale jako u nove * *zpracovani retezcove promenne * 2A 4D 5C ld HL,(DEST) pocatecni adresa ED 4B 72 5C ld BC,(STRLEN) delka FD CB 37 46 bit 0,(FLAGX) prosty retezec ? 20 30 jr NZ,#2BAF ano * *zpracovani retezce z pole a useku retezce * 78 ld A,B delka retezce testovana na 0 B1 or C C8 ret Z pri prazdnem retezci navrat E5 push HL ukazatel na zacatek uschovan F7 rst REST30 v pracovnim prostoru opatreno misto
2B84 2B85 2B86 2B87 2B88 2B89 2B8B 2B8D 2B8E 2B91 2B92 2B93 2B94 2B96 2B97 2B99 2B9A 2B9B 2B9C 2B9D 2B9E 2B9F 2BA1 2BA3 2BA3 2BA4 2BA5 2BA6 2BA6 2BA6 2BA6 2BA6 2BA7 2BA8 2BA9 2BAA 2BAB 2BAD 2BAE 2BAF 2BAF 2BAF 2BAF 2BB0 2BB1 2BB2 2BB3 2BB4 2BB5 2BB8 2BB9 2BBA 2BBB 2BBC 2BBD 2BC0 2BC0 2BC0 2BC0 2BC2
D5 C5 54 5D 23 36 ED E5 CD E1 E3 A7 ED 09 30 44 4D E3 EB 78 B1 28 ED C1 D1 E1
20 B8 F1 2B
42 02
02 B0
push push ld ld inc ld lddr push call pop ex and sbc add jr ld ld ex ex ld or jr ldir
DE BC D,H E,L HL (HL),' ' HL #2BF1 HL (SP),HL A HL,BC HL,BC NC,#2B9B B,H C,L (SP),HL DE,HL A,B C Z,#2BA3
uschovan ukazatel na 1.pozici i delka vyhrazene oblasti _DE nastaven na posledni misto _HL za nej zapise mezeru taktez na ostatni bajty a ukazatel na zacatek uschovan prevezme parametry z calcstacku ukazatel obnoven zamena ukazatele a delky smaze CARRY porovna obe delky novy retezec se vejde jinak je zkracen ("Procrust") v _BC je nova delka zamena delky a ukazatele pointer do _DE,zacatek retezce do _HL delka znovu testovana na nulu pri "" se nic nezapisuje jinak novy retezec prepsan do pracovniho prostoru nova delka ukazatel na novou oblast pocatecni adresa
EB 78 B1 C8 D5 ED B0 E1 C9
2B 2B 2B 7E E5 C5 CD C6 2B C1 E1 03 03 03 C3 E8 19
3E DF 2A 4D 5C
* *podpgm pro zapsani numericke promenne ze zasobniku kalkul. *nebo retezce z pracovniho prostoru do oblasti promennych * ex DE,HL zamena ukazatelu (pro prenos) ld A,B delka testovana na 0 or C ret Z 0:nic se nezapisuje push DE uschova cilove adresy ldir probehne prenos pop HL cilova adresa do _HL ret * *zpracovani celeho,noveho a prosteho retezce (z prikazu 'LET') * dec HL _HL na pismeno nazvu promenne dec HL (tj. na >DEST< -3) dec HL ld A,(HL) prevzeti pismena push HL ulozen ukazatel na retezec push BC (v _BC delka) call #2BC6 novy retezec pripojen k oblasti prom. pop BC obnovena delka pop HL a ukazatel na stary retezec inc BC delka +3 bajty pro nazev inc BC a delku retezce inc BC jp OUT2 stary retezec odstranen * *zpracovani noveho prosteho retezce * ld A,#DF maska pro pismeno ld HL,(DEST) adresa pismena
2BC5 2BC6 2BC7 2BCA 2BCB 2BCC 2BCD 2BCE 2BD1 2BD2 2BD3 2BD4 2BD7 2BD8 2BDB 2BDE 2BDF 2BE0 2BE1 2BE3 2BE4 2BE5 2BE6 2BE7 2BE8 2BE9 2BEA 2BEA 2BEA 2BEA 2BEA 2BEA 2BEB 2BEC 2BEF 2BF0 2BF1 2BF1 2BF1 2BF1 2BF1 2BF4 2BF5 2BF6 2BF7 2BF8 2BF9 2BFA 2BFB 2BFC 2BFD 2BFE 2C01 2C02 2C02 2C02 2C02 2C02 2C02 2C02
A6 F5 CD EB 09 C5 2B 22 03 03 03 2A 2B CD 2A C1 C5 03 ED EB 23 C1 70 2B 71 F1
F1 2B
4D 5C
59 5C 55 16 4D 5C
B8
and push call ex add push dec ld inc inc inc ld dec call ld pop push inc lddr ex inc pop ld dec ld pop
(HL) AF #2BF1 DE,HL HL,BC BC HL (DEST),HL BC BC BC HL,(ELINE) HL MAKESP HL,(DEST) BC BC BC DE,HL HL BC (HL),B HL (HL),C AF
upraveno maskou a uschovano parametry retezce (delka zacatek) do _HL prictena delka (da konec +1) ktera je uschovana _HL ted ukazuje na posledni misto tento ukazatel uschovan delka +3 pro bajt nazvu a delku retezce _HL nastaveno na koncovy bajt oblasti promennych vytvoren potrebny prostor obnoveni ukazatele delka do _BC +1 (pro prazdny retezec) okopirovan retezec (+1 bajt navic) _HL nastavi na misto,kam prijde udaj o delce obnovena delka a zapsana (MSB) na toto misto (LSB) v _A obnoven nazev promenne
2B 77 2A 59 5C 2B C9
2A 65 5C 2B 46 2B 4E 2B 56 2B 5E 2B 7E 22 65 5C C9
CD B2 28
* *podpgm pro zapsani prvniho znaku nazvu promenne *(na puvodni znacku #80); _HL ukazuje na tento bajt *a prebere adresu noveho konce oblasti promennych * dec HL korekce ukazatele ld (HL),A zapsani bajtu nazvu ld HL,(ELINE) nova pozice koncoveho bajtu dec HL ret * *podpgm pro prevzeti posledni polozky ze zasobniku kalkulatoru *(hodnoty promenne nebo parametru retezce) * ld HL,(STKEND) ukazatel na konec zasobniku dec HL ld B,(HL) po jednotlivych bajtech do _A.._E dec HL ld C,(HL) dec HL ld D,(HL) dec HL ld E,(HL) dec HL ld A,(HL) ld (STKEND),HL novy konec zasobniku kalkulatoru ret * *prikaz 'DIM' *tato rutina slouzi ke zrizeni a deklaraci poli *pokud pole stejneho jmena existuje je prepsano *cele pole je vyplneno: numericke 0, retezcove mezerami * call #28B2 prohledani oblasti promennych
2C05 2C08 2C0B 2C0D 2C0F 2C0F 2C12 2C15 2C17 2C18 2C1B 2C1E 2C1F 2C1F 2C21 2C23 2C24 2C27 2C29 2C2B 2C2D 2C2E 2C2F 2C31 2C34 2C37 2C38 2C39 2C3A 2C3B 2C3C 2C3D 2C40 2C41 2C42 2C44 2C46 2C48 2C4A 2C4B 2C4C 2C4D 2C4E 2C50 2C51 2C52 2C53 2C54 2C57 2C58 2C59 2C5A 2C5B 2C5C 2C5F 2C60 2C63 2C64 2C65 2C66
C2 CD 20 CB CD CD 38 C5 CD CD C1 CB 06 C5 21 CB 20 2E EB E7 26 CD DA E1 C5 24 E5 60 69 CD EB DF FE 28 FE 20 E7 C1 79 68 26 23 23 29 19 DA D5 C5 E5 44 4D 2A 2B CD 23 77 C1 0B
8A 1C 30 25 08 B1 96 29 EE 1B 08 B8 19 E8 19 * F9 00 01 00 71 02 05 FF CC 2A 20 2A
jp call jr res call call jr push call call pop set ld push ld bit jr ld ex rst ld call jp pop push inc push ld ld call ex rst cp jr cp jr rst pop ld ld ld inc inc add add jp push push push ld ld ld dec call inc ld pop dec
NZ,#1C8A CHESYN NZ,#2C15 6,C #2996 SYNTX C,#2C1F BC #19B8 OUT2 BC 7,C B,0 BC HL,1 6,C NZ,#2C2D L,5 DE,HL GETNXT H,#FF #2ACC C,#2A20 HL BC H HL H,B L,C #2AF4 DE,HL GETACT ',' Z,#2C2E ')' NZ,#2C05 GETNXT BC A,C L,B H,0 HL HL HL,HL HL,DE C,#1F15 DE BC HL B,H C,L HL,(ELINE) HL MAKESP HL (HL),A BC BC
pri 'Nonsense...':skok bezi pgm ? ano pri kontrole syntaxe retezcove pole upraveno na normalni test na vyraz v zavorkach prechod na dalsi prikaz skok pri novem poli uschova popisneho bajtu vyhledani zacatku dalsi promenne stare pole odstraneno obnoveni popisneho bajtu bit7 "popisu" nastaven pocitadlo dimenzi =0 a uschovano velikost prvku 1 pro retezec retezcove pole ? ano jinak numericke: velikost prvku 5 velikost prvku do _DE >CHADD< +1,dalsi znak limit pro velikost pole prinese parametry pole prilis velke:chyba rozmer parametr uschovan pri kazde smycce rozmer +1 a vracen na zasobnik parametr okopirovan do _HL spocitan celkovy pocet bajtu a vlozen do _DE aktualni znak je carka pro dalsi parametr ? ano jinak to musi byt zavorka pokud ne:chyba >CHADD< +1 pocitadlo dimenzi do _B "popisny" bajt do _A dimenze do _HL +2 *2 a prictena velikost pole prilis velke:'Out of memory' pocet prvku "popisny" bajt a celkova velikost ulozeny celkova velikost do _BC konec oblasti promennych do _HL (bajt #80) vyhradi prostor _HL na prvni novou pozici zapsano "popisne" pismeno nazvu obnovena celkova delka
F4 2A 2C E8 29 BB
00
15 1F
59 5C 55 16
2C67 2C68 2C69 2C6A 2C6B 2C6C 2C6D 2C6E 2C6F 2C70 2C71 2C72 2C73 2C74 2C76 2C78 2C7A 2C7C 2C7D 2C7F 2C80 2C81 2C82 2C83 2C84 2C85 2C87 2C88 2C88 2C88 2C88 2C88 2C8B 2C8C 2C8D 2C8D 2C8D 2C8D 2C8F 2C90 2C91 2C93 2C94 2C96 2C97 2C98 2C9A 2C9B 2C9B 2C9B 2C9B 2C9B 2C9D 2C9F 2CA2 2CA3 2CA5 2CA7 2CA7 2CA9
0B 0B 23 71 23 70 C1 78 23 77 62 6B 1B 36 CB 28 36 C1 ED C1 70 2B 71 2B 3D 20 C9
00 71 02 20 B8
F8
dec dec inc ld inc ld pop ld inc ld ld ld dec ld bit jr ld pop lddr pop ld dec ld dec dec jr ret
BC BC HL (HL),C HL (HL),B BC A,B HL (HL),A H,D L,E DE (HL),0 6,C Z,#2C7C (HL),' ' BC BC (HL),B HL (HL),C HL A NZ,#2C7F
-3 dalsi nova pozice na ni se zapise delka (LSB) (MSB) obnoveno pocitadlo dimenzi a okopirovano do _A tato hodnota zapsana _HL na posledni pozici _DE na predposledni na posledni misto ulozena 0 nebo,pokud jde o retezec (ne:numericke) pak mezera obnoven pocet prvku a pole +1 bajt zaplneno (0 nebo ' ') obnoven rozmer a zapsan do hlavicky pole (MSB) (LSB) pocitadlo dimenzi -1 takto zaplneny vsechny dimenze
CD 1B 2D 3F D8
FE 3F D0 FE D8 FE 3F D0 FE C9
41 5B 61 7B
FE 20 11 E7 D6 CE
C4 19 00 00 31 00
20 0A EB
* *podpgm pro test znaku na alfanumericky *pri pismenu a cislici je CARRY nastaveno * call NUMBER test na cislici ccf ret C pri cislici navrat * *podpgm testuje znak na pismeno, pro pismeno nastavi CARRY * cp #41 velka pismena jsou od #41 do ccf ret NC cp #5B #5B (tj. 'Z' +1) ret C cp #61 'a' (male); mala pismena jsou od #61 ccf ret NC cp #7B do #7B (male 'z' +1) ret * *podpgm prevede decimalni (nebo binarni po 'BIN') cislo *na cislo v plovouci tecce,ktere ulozi na zasobnik kalkulatoru * DECFLO cp #C4 token 'BIN' ? jr NZ,#2CB8 ne ld DE,0 vysledek implicitne 0 BINFLO rst GETNXT >CHADD< +1,nasledujici znak sub '1' - '1' adc 0 (vysledek vzdy 0,ale) pro '1' je CARRY smazano, pro '0' nastaveno jr NZ,#2CB3 pri vsech jinych znacich:skok ex DE,HL dosavadni vysledek prevodu do _HL
2CAA 2CAB 2CAD 2CAD 2CB0 2CB1 2CB3 2CB3 2CB4 2CB5 2CB8 2CB8 2CB8 2CB8 2CBA 2CBC 2CBF 2CC1 2CC3 2CC4 2CC7 2CC9 2CCB 2CCB 2CCB 2CCB 2CCC 2CCF 2CD2 2CD3 2CD4 2CD5 2CD5 2CD6 2CD7 2CD8 2CD9 2CDA 2CDA 2CDB 2CDE 2CDE 2CE0 2CE1 2CE2 2CE3 2CE4 2CE5 2CE6 2CE6 2CE7 2CE8 2CE9 2CEB 2CEB 2CEB 2CEB 2CED 2CEF 2CF1
3F ED 6A DA AD 31 EB 18 EF * 42 4B C3 2B 2D
negace CARRY (pro '1'=1,pro '0'=0) dosavadni vysledek posunut doleva a CARRY pricteno do bitu0 > 65536: chyba vysledek uschovan dalsi znak BIN vyrazu konecny vysledek okopirovan do _BC
FE 28 CD FE 20 E7 CD 38 18
2E 0F 3B 2D 2E 28 1B 2D 22 0A
E7 CD 1B 2D DA 8A 1C EF A0 38 EF A1 C0 02 38 DF CD 22 2D 38 0B EF E0 A4 05 C0 04 0F 38 E7 18 EF
FE 45 28 03 FE 65 C0
a ulozen na zasobnik kalkulatoru * *pri decimalnim cisle nejprve celociselna cast * cp '.' hned prvni znak desetinna tecka ? jr Z,#2CCB bez celociselne casti:skok call #2D3B cast pred teckou na calcstack cp '.' nasleduje desetinna cast ? jr NZ,#2CEB ne:prosetren exponent rst GETNXT >CHADD< +1,dalsi znak call NUMBER je to cislice ? jr C,#2CEB ne:prosetren exponent jr #2CD5 zpracovani desetinne casti * *zpracuje cislo zacinajici desetinou teckou * rst GETNXT >CHADD< +1,dalsi znak call NUMBER je to cislice ? jp C,#1C8A ne:chyba rst CALSW volan kalkulator DEFB #A0 0->stack jako hodnota celocisel.casti DEFB #38 navrat z kalk. * rst CALSW DEFB #A1 1->stack DEFB #C0 stack->mem0 DEFB #02 drop; smaze jednicku na zasobniku DEFB #38 posledni hodnota na zasobniku je nyni celociselna hodnota rst GETACT prevezme aktualni znak call #2D22 testuje na cislici a jeji hodnotu ulozi na calcstack jr C,#2CEB neni to cislice:prosetri exponent rst CALSW DEFB #E0 mem0->stack DEFB #A4 10->stack DEFB #05 mem0/10:vysledek bude .1,pak .01,... DEFB #C0 vysledek->mem0 DEFB #04 nactenou cislici vynasobi s (mem0) tim ziska hodnotu zavisle na pozici DEFB #0F plus dosavadni vysledek DEFB #38 rst GETNXT >CHADD< +1 jr #2CDA dale ve smycce * *prosetreni exponentu * cp 'E' nasleduje 'E' (velke) jr Z,#2CF2 cp 'e' nebo 'e' (male) pro exponent ? ret NZ ne
2CF2 2CF2 2CF4 2CF5 2CF7 2CF9 2CFB 2CFD 2CFE 2CFF 2D02 2D04 2D05 2D08 2D0B 2D0C 2D0F 2D10 2D13 2D14 2D16 2D18 2D1B 2D1B 2D1B 2D1B 2D1D 2D1E 2D20 2D21 2D22 2D22 2D22 2D22 2D25 2D26 2D28 2D28 2D28 2D28 2D29 2D2B 2D2B 2D2B 2D2B 2D2B 2D2B 2D2B 2D2B 2D2F 2D30 2D31 2D32 2D33 2D34 2D37 2D38 2D39 2D3A 2D3B
* 06 E7 FE 28 FE 20 04 E7 CD 38 C5 CD CD C1 DA A7 FA 04 28 ED C3 FF 2B 05 2D 02 1B 2D CB 3B 2D D5 2D AD 31 AD 31 02 44 4F 2D ld rst cp jr cp jr inc rst call jr push call call pop jp and jp inc jr neg jp B,#FF GETNXT '+' Z,#2CFE '-' NZ,#2CFF B GETNXT NUMBER C,#2CCF BC #2D3B #2DD5 BC C,#31AD A M,#31AD B Z,#2D18 _B je znamenko (#FF='+') na dalsi znak kladny exponent ? ano zaporny exponent ? ne:tedy implicitne kladny _B=0 pro zaporny dalsi znak nasleduje decimalni cislice ? ne:chyba znamenko uschovano exponent na calcstack take do _A obnoveni znamenka exponent >255:chyba exponent >127 ? ano:chyba zaporny exponent ? ne ano:vytvoren doplnek exponent pripojen k cislu
FE 30 D8 FE 3A 3F C9
CD 1B D8 D6 30
4F 06 00
FD 21 AF 5F 51 48 47 CD B6 EF 38 A7 C9
#2D4F * *podpgm pro test,zda cislice; pokud ano:nastavi CARRY * NUMBER cp '0' ret C cp ':' v ASCII '9' +1 ccf ret * *podpgm pro ulozeni hodnoty cislice na calcstack * 2D call NUMBER kdyz nejde o cislici,hned navrat ret C sub '0' ze znaku cislo * *podpgm ulozi binarni cislo v _A na calcstack * ld C,A kopie do _BC ld B,0 (_B je 0) * *podpgm pro ulozeni celeho cisla v _BC na calcstack ve *formatu cisla v plovouci tecce *1. a 5. bajt jsou vzdy 0 *2. obsahuje znamenko (0:kladne,#FF:zaporne) *3. bajt je LSB, 4. je MSB * 3A 5C ld IY,ERRNR znovu iniciace _IY xor A _A=0 ld E,A _E take pro kladne ld D,C LSB do _D ld C,B MSB do _C ld B,A _B=0 2A call #2AB6 ulozeni cisla na calcstack rst CALSW kalkulator volan kvuli DEFB #38 nastaveni _HL na >STKEND< -5 and A smazani CARRY ret *
2D3B 2D3B 2D3B 2D3C 2D3D 2D3E 2D3F 2D40 2D43 2D44 2D45 2D46 2D46 2D47 2D48 2D49 2D4A 2D4D 2D4F 2D4F 2D4F 2D4F 2D4F 2D4F 2D4F 2D4F 2D50 2D51 2D53 2D54 2D55 2D56 2D59 2D5C 2D5D 2D5E 2D5F 2D60 2D62 2D64 2D65 2D66 2D66 2D67 2D68 2D69 2D6A 2D6B 2D6C 2D6D 2D6E 2D6F 2D70 2D71 2D73 2D74 2D75 2D76 2D77 2D78
F5 EF A0 38 F1 CD 22 2D D8 EF 01 A4 04 0F 38 CD 74 00 18 F1
*podpgm pro * push rst DEFB DEFB pop call ret rst DEFB DEFB DEFB DEFB DEFB call jr
ulozeni celeho dec.cisla na calcstack AF CALSW #A0 #38 AF #2D22 C CALSW #01 #A4 #04 #0F #38 #0074 #2D40 prvni cislice je uschovana volan kalkulator 0->stack prvni cislice obnovena a ulozena na calcstack pokud neslo o cislici:navrat volan kalkulator swap;cislice pod vrchol,aby mohl byt predchozi vysledek (10->stack) vynasoben 10 pak je secten s cislici konec kalk. prevezme dalsi znak a pokracuje
07 0F 30 2F 3C F5 21 CD EF A4 38 F1 CB 30 F5 EF
02
92 5C 0B 35
3F 0D
C1 E0 00 04 04 33 02 05 E1 38 F1 28 08 F5 EF 31 04 38 F1
* *aritmeticke rutiny * *premena dec.cisla ve tvaru mantisa,exponent (x E n) *na cislo v plovouci tecce * x jiz lezi na zasobniku kalkulatoru * rlca pro zjisteni znamenka je bit7 _A rrca presunut do CARRY beze zmeny _A jr NC,#2D55 pri kladnem exponentu cpl toto provede "neg" inc A beze zmeny CARRY push AF vysledek uschovan ld HL,MEMBOT z predchoziho znamenka v mem0 call #350B udela 0:kladne, 1:zaporne rst CALSW x je na calcstacku DEFB #A4 x 10 DEFB #38 navrat z kalk. pop AF obnovi exponent v _A EXLOOP srl A a jednotlive bity posunuje do CARRY jr NC,#2D71 bit byl 0:_A testovan na 0 push AF uschova zbytek hodnoty exponentu rst CALSW X' 10^2^M, kde M=0..5, pricemz X' je mezihodnota mantisy DEFB #C1 10^2^M->mem1 DEFB #E0 X' 10^2^M Z ;Z je znamenko z mem0 DEFB #00 X' 10^2^M ; je-li Z zaporne (1), DEFB #04 pak skok na EXDIV DEFB #04 X'*10^2^M ; nasobeni DEFB #33 X' (nove) ; vzdy skok na EXGET1 DEFB #02 (velikost skoku) EXDIV DEFB #05 X'/(10^2^M) EXGET1 DEFB #E1 X'(nove) 10^2^M ; z mem1 DEFB #38 navrat z kalk. pop AF zbytek exponentu a ZERO jr Z,#2D7B skok,pokud je zbytek exponentu 0 push AF uschova zbytku exponentu rst CALSW X' 10^2^M DEFB #31 X' 10^2^M 10^2^M ;dup DEFB #04 X' 10^2^(M+1) ; multiply DEFB #38 dava X' 10^2^M pro smycku pop AF obnoveni zbytku exponentu
2D79 2D7B 2D7B 2D7C 2D7D 2D7E 2D7F 2D7F 2D7F 2D7F 2D80 2D81 2D82 2D83 2D84 2D85 2D86 2D87 2D88 2D89 2D8A 2D8B 2D8C 2D8C 2D8C 2D8C 2D8C 2D8E 2D8F 2D8F 2D91 2D92 2D93 2D94 2D95 2D96 2D97 2D98 2D99 2D9A 2D9B 2D9C 2D9D 2D9E 2DA0 2DA1 2DA2 2DA2 2DA2 2DA2 2DA2 2DA3 2DA4 2DA5 2DA6 2DA8 2DA9 2DAA 2DAB 2DAC
18 E5 * EF 02 38 C9
jr
EXLOOP
23 4E 23 7E A9 91 5F 23 7E 89 A9 57 C9
0E 00 E5 36 00 23 71 23 7B A9 91 77 23 7A 89 A9 77 23 36 00 E1 C9
EF 38 7E A7 28 05 EF A2 0F 27 38
* *podpgm pro prevzeti celeho cisla ze zasobniku kalkulatoru * inc HL nyni adresuje znamenko ld C,(HL) to je prevzato do _C,#FF znaci zapor. inc HL adresuje LSB ld A,(HL) prevezme LSB xor C a vytvori 1.doplnek sub C neg: prictenim 1: 2.doplnek ld E,A LSB do _E inc HL ukazuje na MSB ld A,(HL) prevezme jej adc C a pokud je zaporny xor C vytvori 2.doplnek ld D,A MSB do _D ret * *podpgm pro zapis celeho cisla na zasobnik kalkulatoru *(opak predchoziho podpgmu) * ld C,0 vstupni bod pro kladne cislo push HL vstup se znamenkem v _C (#FF:zaporne, 0:kladne) ld (HL),0 nulovan prvni bajt inc HL ld (HL),C znamenko zapsano do druheho inc HL pro zaporne cislo bude vytvoren ld A,E 2.doplnek xor C nejprve pro LSB sub C ld (HL),A LSB zapsan inc HL ld A,D zpracovan MSB adc C xor C ld (HL),A a take zapsan inc HL ld (HL),0 5.bajt taktez nulovy pop HL obnoveni ukazatele na prvni bajt ret * *podpgm pro zmenu cisla v plov.tecce na cislo "integer" *a preneseni vysledku do _BC * rst CALSW _HL nastavi na (>STKEND<)-5 DEFB #38 (tj. na prvni bajt posledni polozky) ld A,(HL) prevzeti exponentu and A pokud je nulovy,jde o cislo "integer" jr Z,#2DAD rst CALSW jinak jde o cislo v plov.tecce DEFB #A2 .5->stack DEFB #0F add;secte s exponentem DEFB #27 int;provede fci "int" DEFB #38 -65536<X<65536
2DAD 2DAE 2DAF 2DB0 2DB1 2DB2 2DB3 2DB4 2DB7 2DB8 2DB9 2DBB 2DBC 2DBD 2DBE 2DBF 2DC0 2DC1 2DC1 2DC1 2DC1 2DC1 2DC1 2DC1 2DC2 2DC3 2DC4 2DC5 2DC6 2DC7 2DC8 2DCB 2DCC 2DCD 2DD2 2DD3 2DD4 2DD5 2DD5 2DD5 2DD5 2DD5 2DD5 2DD8 2DD9 2DDA 2DDB 2DDC 2DDE 2DDF 2DE0 2DE1 2DE2 2DE3 2DE3 2DE3 2DE3 2DE3 2DE4 2DE5
EF 02 38 E5 D5 EB 46 CD 7F 2D AF 90 CB 79 42 4B 7B D1 E1 C9
rst DEFB DEFB push push ex ld call xor sub bit ld ld ld pop pop ret
CALSW #02 #38 HL DE DE,HL B,(HL) #2D7F A B 7,C B,D C,E A,E DE HL
drop;smaze vysledek (posunem ukaz. takze v pameti zustava !) uschova obou ukazatelu na zasobnik kalkulatoru _HL ukazuje na cislo prevezme exponent (musi byt 0) prevezme znamenko + 2 bajty nulovani _A a CARRY pokud je exponent 0,nastavi CARRY nastavi ZERO pro kladne MSB do _B LSB do _C LSB take do _A obnoveni obou ukazatelu na zasobnik kalkulatoru
* *podpgm pro vypocet "log(2^_A)" *_A obsahuje exponent cisla v plov.tecce; vypocet slouzi *ke stanoveni poctu platnych mist pred desetinnou teckou *nebo poctu nul za ni pro vypis cisla * 57 LOG2A ld D,A _A bude zpracovano tak,ze 17 rla na calcstack je ulozeno 9F sbc A kdyz _A je kladne :#00 #00 A #00 #00 5F ld E,A kdyz _A je zaporne:#00 #FF A #FF #00 4F ld C,A AF xor A hodnoty jsou ulozeny do 47 ld B,A odpovidajicich registru CD B6 2A call #2AB6 pro volani ukladaciho podpgmu EF rst CALSW A ;na calcstacku hodnota A (viz vyse) 34 DEFB #34 number->stack EF 1A 20 9A DEFB #EF #1A #20 #9A #85 ;tj. log 2 pri zakladu 10 04 DEFB #04 A*log2 ;tj. log(2^A) 27 DEFB #27 ;int 38 DEFB #38 int(log(2^A)) * *cislo v plov.tecce zmeni na jednobajtovou hodnotu ("int") *kterou ulozi do _A *pokud je vysledek >255, vypis chyboveho hlaseni * CD A2 2D call #2DA2 cislo v plov.tecce do _BC jako "int" D8 ret C vysledek prilis velky (>65536) F5 push AF uschova vysledku 05 dec B MSB musi byt 0 04 inc B 28 03 jr Z,#2DE1 ano: vysledek <256 F1 pop AF jinak chyba:odejmuti vysledku ze 37 scf zasobniku a nastaveni CARRY C9 ret F1 pop AF vysledek zpet do _A C9 ret navrat se smazanym CARRY:bez chyby * *podpgm pro vydani cisla v plov.tecce prostrednictvim *prikazu 'PRINT' nebo 'STR$' * EF rst CALSW X 31 DEFB #31 X X ;dup 36 DEFB #36 X X<0?
2DE6 2DE7 2DE8 2DE9 2DEA 2DEB 2DEC 2DED 2DEE 2DF0 2DF1 2DF2 2DF2 2DF2 2DF2 2DF2 2DF2 2DF3 2DF4 2DF6 2DF7 2DF8 2DF8 2DF8 2DF8 2DF9 2DFA 2DFB 2DFC 2DFD 2DFE 2DFF 2E00 2E01 2E02 2E03 2E04 2E05 2E06 2E07 2E08 2E09 2E0A 2E0B 2E0C 2E0D 2E0F 2E12 2E14 2E15 2E16 2E18 2E19 2E1B 2E1C 2E1E 2E1F 2E20 2E21 2E22
00 0B 31 37 00 0D 02 38 3E 30 D7 C9
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB ld rst ret
#00 #0B #31 #37 #00 #0D #02 #38 A,'0' PRTOUT
X ano:X je zaporne ;jrt pak skok na FPNEGA X X ;dup X X>0? X ano:X je kladne ;jrt pak skok na FPPOSI ;drop navrat z kalk. cislo bylo 0 ta je vypsana a hotovo
2A 38 3E 2D D7 EF
A0 C3 C4 C5 02 38 D9 E5 D9 EF 31 27 C2 03 E2 01 C2 02 38 7E A7 20 CD 06 7A A7 20 B3 28 53 06 D5 D9 D1 D9 18
47 7F 2D 10 06 09 08
57
* *pro zaporne cislo nejprve vypsano znamenko minus a potom *vytvoreno ABS(X),takze *s cislem se dale pracuje jako s kladnym * FPNEGA DEFB #2A abs(X) DEFB #38 navrat z kalk. ld A,'-' znamenko minus rst PRTOUT vypsano rst CALSW a znovu volan kalkulator * *dale je X jeho absolutni hodnota * FPPOSI DEFB #A0 X 0 ;0->stack DEFB #C3 0->mem3 DEFB #C4 0->mem4 DEFB #C5 0->mem5 DEFB #02 X ;drop DEFB #38 navrat z kalk. exx _HL' obsahuje ofset pro kalkulator push HL ten je uschovan exx rst CALSW X DEFB #31 X X ;dup DEFB #27 X int(X)=I DEFB #C2 X I ;I->mem2 DEFB #03 X-I=F ;sub DEFB #E2 F I ;mem2->stack DEFB #01 I F ;swap DEFB #C2 I F ;F->mem2 DEFB #02 I ;drop DEFB #38 navrat z kalk. ld A,(HL) test,zda I<65536 and A jr NZ,#2E56 ne call #2D7F "I" predano do _DE ld B,16 pocitadlo pro 16 bitu ld A,D MSB hodnoty "I" and A testovan na 0 jr NZ,#2E1E ne: I>255 or E cele I=0 ? jr Z,#2E24 ano: pouze mista za des.teckou ld D,E LSB okopirovan do _D ld B,8 pocitadlo pro 8 bitu push DE _DE je pres zasobnik exx pop DE okopirovano do _DE' exx jr #2E7B
2E24 2E24 2E24 2E24 2E25 2E26 2E27 2E28 2E2A 2E2D 2E2E 2E31 2E32 2E35 2E36 2E39 2E3A 2E3B 2E3C 2E3D 2E3E 2E3F 2E40 2E43 2E44 2E47 2E48 2E49 2E4A 2E4B 2E4E 2E4F 2E50 2E51 2E52 2E53 2E56 2E56 2E56 2E56 2E56 2E58 2E5A 2E5C 2E5F 2E61 2E62 2E65 2E66 2E67 2E68 2E6A 2E6D 2E6F 2E6F 2E6F 2E6F 2E70 2E73 2E74
EF E2 38 7E D6 CD 57 3A 92 32 7A CD EF 31 27 C1 03 E1 38 CD E5 32 3D 17 9F 3C 21 77 23 86 77 E1 C3
7E C1 2D AC 5C AC 5C 4F 2D
D5 2D A1 5C
AB 5C
CF 2E
D6 FE 38 CD D6 47 21 86 77 78 ED CD 18
80 1C 13 C1 2D 07 AC 5C
44 4F 2D 92
EB CD BA 2F D9 CB FA
* *zpracovani v pripade,kdyz existuje jen cast za des.teckou * rst CALSW I (=0) DEFB #E2 I F ;mem2->stack DEFB #38 navrat z kalk. ld A,(HL) bajt exponentu do _A sub #7E k ziskani spravneho exponentu -126 call LOG2A M=_A=abs int(log(2^A)) ld D,A kopie M do _D ld A,(#5CAC) precten 2.bajt z mem5 sub D od neho odecteno M ld (#5CAC),A a zapsan zpet ld A,D kopie M do _A call #2D4F Y=F*10^M ulozi na calcstack rst CALSW I Y DEFB #31 I Y Y ;dup DEFB #27 I Y int(Y)=J DEFB #C1 I Y J ;J->mem1 DEFB #03 I Y-J ;sub DEFB #E1 I Y-J J;mem1->stack DEFB #38 call #2DD5 preda J z calcstacku do _A push HL uschova ukazatele na (Y-J) ld (#5CA1),A adresa 1.bajtu mem3 dec A J (v_A) zpracovano tak, rla ze 0 je ponechana,avsak sbc A jine cislo dava 1 inc A (slouzi jako pocitadlo) ld HL,#5CAB adresa 1.bajtu mem5 ld (HL),A pocitadlo zapsano inc HL toto cislo je pricteno add (HL) k poctu vypisovanych mist pred ld (HL),A desetinnou teckou pop HL obnoven ukazatel na (Y-J) jp #2ECF * *cisla,vetsi nez 2^27,jsou zpracovana tak,ze *je vypsano 8 mist pred des.teckou * sub #80 spocitan spravny exponent cp 28 mensi nez 28 ? jr C,#2E6F ano call LOG2A M spocitano v _A sub 7 M-7 ld B,A okopirovano do _B ld HL,#5CAC ke 2.bajtu mem5 add (HL) pricteno M-7 :pocet mist pro ld (HL),A vypis pred desetinnou teckou ld A,B vypocet: I*(10-(M-7)) pro neg call #2D4F vypis cisla zkorigovany poctem jr #2E01 platnych mist, skok zpet do smycky * *celociselna cast X ulozena do bufferu pro vypis (mem3,mem4) * ex DE,HL _DE ukazuje na I, _HL na F call #2FBA mantisa z I do _DE/_DE' exx set 7,D pozn:spravny numericky vysledek
2E76 2E77 2E78 2E7A 2E7B 2E7B 2E7D 2E7F 2E80 2E82 2E84 2E85 2E88 2E8A 2E8B 2E8C 2E8C 2E8D 2E8E 2E8F 2E90 2E92 2E94 2E94 2E94 2E94 2E94 2E95 2E98 2E9B 2E9D 2E9F 2EA1 2EA3 2EA5 2EA6 2EA7 2EA9 2EAA 2EAB 2EAE 2EB1 2EB3 2EB5 2EB7 2EB8 2EBA 2EBD 2EBF 2EC1 2EC4 2EC6 2EC9 2ECB 2ECB 2ECB 2ECB 2ECC 2ECD 2ECE
7D D9 D6 80 47 * CB CB D9 CB CB D9 21 0E 7E 8F 23 12 13 12 AA 5C 05
ld A,L exx sub #80 ld B,A sla rl exx rl rl exx ld ld ld adc daa ld dec dec jr djnz E D E D HL,#5CAA C,5 A,(HL) A (HL),A HL C NZ,#2E8A #2E7B
exponent z I do _A vypocet spravneho exponentu dava potrebny pocet bitu mantisa z I se po bitech rotaci vlevo prepisuje do mem4 pritom vzdy probiha dekadicka korekce ctyri bajty z I jsou obsazeny v _DE a _DE' 5.bajt z mem4 dekadicka korekce se tyka 5 bajtu prevezme jeden bajt z mem4 timto se posune o bit doleva a CARRY se pricte do bitu0 dekadicka korekce vraceni bajtu posun ukazovatka pocitadlo bajtu -1 jeste neni hotovo 5 bajtu doposud nezpracovany vsechny bity I
27 77 2B 0D 20 F8 10 E7
AF 21 11 06 ED 0E ED 20 0D 0C 20 12 13 FD FD 0E CB 28 23 10 3A D6 38 FD 3E FD 18
A6 5C A1 5C 09 6F FF 6F 04 0A 34 71 34 72 00 40 01 E7 AB 5C 09 0A 35 71 04 BE 6F 41
EF 02 E2 38
* *vysledek je nyni v mem4 a bude rozdelen zpravidla na *9 bajtu do mem3 a mem4 * xor A nulovani _A ld HL,#5CA6 prvni bajt mem4 ld DE,#5CA1 prvni bajt mem3 ld B,9 pocitadlo mist rld smazana leva pulka 1.bajtu mem4 ld C,#FF pozn:uvodni nuly rld leva pulka (_HL) do _A,prava do leve jr NZ,#2EA9 desetinne misto v _A je nulove dec C test na uvodni nulu inc C jr NZ,#2EB3 ano ld (DE),A zapsani cislice inc DE posun ukazatele inc (IY+#71) bude vypsano o 1 misto vice inc (IY+#72) o jedno vice pred desetinnou teckou ld C,0 pozn:jiz bez uvodnich mezer bit 0,B ukazatel na mem4 je posunut jr Z,#2EB8 jen pri kazdem druhem pruchodu inc HL djnz #2EA1 pocitadlo mist jeste nenulove ld A,(#5CAB) test na 9 cislic bez sub 9 uvodnich nul jr C,#2ECB pokud mene,prevezme dalsi cislici dec (IY+#71) pocet mist nastaven na 8 ld A,4 pro zaokrouhleni posledni cislice cp (IY+#6F) 4.bajt mem4 porovnan se 4,ovliv.CARRY jr DCROND na zaokrouhleni * *mista za desetinnou teckou nyni ulozena do vypisoveho bufferu * rst CALSW I DEFB #02 ;drop DEFB #E2 F ;mem2->stack DEFB #38 F ;navrat z kalk.
2ECF 2ED0 2ED3 2ED4 2ED6 2ED7 2ED9 2EDB 2EDC 2EDF 2EDF 2EE2 2EE4 2EE6 2EE7 2EE9 2EEA 2EEC 2EEC 2EEF 2EF0 2EF3 2EF4 2EF5 2EF8 2EF9 2EFA 2EFB 2EFC 2EFE 2F01 2F02 2F05 2F06 2F07 2F0A 2F0C 2F0C 2F0C 2F0C 2F0D 2F10 2F13 2F15 2F16 2F17 2F18 2F19 2F1A 2F1C 2F1D 2F1E 2F20 2F22 2F23 2F25 2F27 2F29 2F2A 2F2D
EB CD D9 3E 95 2E CB D9 CD FD FE 38 D9 CB D9 18 01 7B CD 5F 7A CD 57 C5 D9 C1 10 21 79 FD 09 77 FD 18
BA 2F 80 00 FA DD 2F 7E 71 08 06 12 20 * 00 02 8B 2F 8B 2F
ex call exx ld sub ld set exx call ld cp jr exx rl exx jr ld ld call ld ld call ld push exx pop djnz ld ld ld add ld inc jr
DE,HL #2FBA A,#80 L L,0 7,D SHIFTF A,(IY+#71) 8 C,#2EEC D DCROND BC,#0200 A,E #2F8B E,A A,D #2F8B D,A BC BC #2EEF HL,#5CA1 A,C C,(IY+#71) HL,BC (HL),A (IY+#71) #2EDF
_DE ukazuje na F mantisa hodnoty F do _DE/_DE' uprava exponentu pro cast za des.teckou exponent nulovy pozn:numericky vysledek posuny pro prizpusobeni casti pred teckou pocitadlo mist z mem5 nastaveno rozmezi 8 ? ne pri 8 mistech jen nejvyssi bit nejvyssiho bajtu rotovan do CARRY pro zaokrouhleni _C=0 pro dalsi,_B=2 pro pocitani nyni jednotlive _D',_E' _D a _E nasobeny 10 _C nyni obsahuje CARRY bude spocitano 10*_A+_C pro _D'.. pocitadlo uschovano druha sada registru pocitadlo obnoveno nejsou zpracovany obe sady:skok prvni bajt z mem3 vysledek do _A nynejsi pocet mist do _C adresovan prvni prazdny bajt do nej ulozeno _A o jedno misto vice dale do 8 mist
F1 A1 5C 4E 71 34 71 D3
F5 21 FD 06 09 41 F1 2B 7E CE 77 A7 28 FE 3F 30 10 36 04 FD FD
A1 5C 4E 71 00
00 05 0A 08 F1 01 34 72 70 71
* *zaokrouhleni desetinneho mista * DCROND push AF uschova CARRY ld HL,#5CA1 1.bajt mem3, tj. prvni misto ld C,(IY+#71) pocet mist, tj. ofset ld B,0 ulozen do _BC add HL,BC nyni ukazuje na posledni bajt ld B,C pocet mist do _B pro odpocitavani pop AF obnoveni CARRY dec HL o jedno misto v cisle zpet ld A,(HL) precteni cislice adc 0 a pricteni CARRY pro zaokrouhleni ld (HL),A vysledek zapsan and A pokud je to 0 jr Z,#2F25 nepocita se do mist vypisu cp 10 10 take ne,ale musi se znovu ccf zaokrouhlovat jr NC,#2F2D platna cislice (1..9):skok djnz #2F18 dale v zaokrouhlovaci smycce ld (HL),1 zde je po zaokr.treba doplnit 1 inc B +1 cislice inc (IY+#72) +1 misto pred teckou ld (IY+#71),B zapsan pocet mist
2F30 2F31 2F32 2F33 2F34 2F35 2F36 2F36 2F36 2F36 2F3A 2F3D 2F3E 2F40 2F42 2F44 2F46 2F47 2F4A 2F4B 2F4C 2F4F 2F50 2F52 2F52 2F52 2F52 2F53 2F54 2F56 2F57 2F58 2F59 2F5C 2F5E 2F5F 2F60 2F61 2F62 2F64 2F65 2F67 2F69 2F6A 2F6C 2F6C 2F6C 2F6C 2F6D 2F6E 2F70 2F73 2F75 2F76 2F77 2F78 2F79 2F7C 2F7E 2F7F
EF 02 38 D9 E1 D9
F -
vracen ofset
* *cislo muze byt vypsano * ED 4B AB 5C ld BC,(#5CAB) pocet mist 21 A1 5C ld HL,#5CA1 1.bajt mem3 je 1.bajt cisla 78 ld A,B pocet mist FE 09 cp 9 je vetsi nez 9 ? 38 04 jr C,#2F46 ne FE FC cp #FC vice nez 4 nuly za des.teckou ? 38 26 jr C,#2F6C ano:vypis ve tvaru s E (*10^) A7 and A cislice pred teckou ? CC EF 15 call Z,#15EF ne:vypsana '0' AF xor A nulovano _A 90 sub B cislice za teckou ? FA 52 2F jp M,#2F52 ano:vypis 47 ld B,A mista za teckou do _B pro odpocitani 18 0C jr #2F5E a vypis * *mista pred teckou vypsana * 79 ld A,C pocet mist A7 and A vypsan ? (v _B pocet vsech mist) 28 03 jr Z,#2F59 ne:doplneni nulami 7E ld A,(HL) jinak prevzeti cislice 23 inc HL posun ukazatele 0D dec C pocitadlo "pred teckou" -1 CD EF 15 call GIV1 vypis cislice 10 F4 djnz #2F52 jeste neni vse vypsano 79 ld A,C vypis tecky probehne,je-li A7 and A _C nenulove C8 ret Z jinak je vypis hotov 04 inc B pocitadlo +1 pro tecku 3E 2E ld A,'.' desetinna tecka D7 rst PRTOUT vypsana 3E 30 ld A,'0' popr. potrebne nuly 10 FB djnz #2F64 41 ld B,C pocitadlo pro zbyvajici cislice 18 E6 jr #2F52 a tisk * *vstupni bod pro tisk cisla v exponencialnim tvaru * 50 ld D,B pocet mist okopirovan do _D 15 dec D -1 dava hodnotu exponentu 06 01 ld B,1 pred teckou je jedna cislice CD 4A 2F call #2F4A vypsani vsech mist 3E 45 ld A,'E' oznaceni exponentu D7 rst PRTOUT vypsano 4A ld C,D hodnota exponentu do _C 79 ld A,C a do _A pro test A7 and A je zaporny ? F2 83 2F jp P,#2F83 ne ED 44 neg jinak invertovan a vlozen do _C 4F ld C,A 3E 2D ld A,'-' znamenko "minus"
2F81 2F83 2F85 2F86 2F88 2F8B 2F8B 2F8B 2F8B 2F8C 2F8D 2F8F 2F90 2F91 2F92 2F93 2F94 2F95 2F96 2F97 2F98 2F99 2F9A 2F9B 2F9B 2F9B 2F9B 2F9C 2F9E 2F9F 2FA0 2FA1 2FA3 2FA5 2FA6 2FA7 2FA8 2FAB 2FAC 2FAD 2FAE 2FAF 2FAF 2FB0 2FB1 2FB2 2FB4 2FB5 2FB7 2FB8 2FB9 2FBA 2FBA 2FBA 2FBA 2FBA 2FBA 2FBA 2FBB 2FBC
18 3E D7 06 C3
02 2B 00 1B 1A
jr ld rst ld jp * *podpgm pro * push ld ld ld ld add add add add ld add ld ld pop ret * *podpgm pro * ld ld and ret inc bit set dec ret push ld add ld ld scf dec ld cpl adc ld djnz ld pop ret
vypsano znamenko "plus" pro kladny exponent vypis znamenka pro vypis exponentu nulovano _B a tento vypsan
vypocet 10*_A+_C DE L,A H,0 E,L D,H HL,HL HL,HL HL,DE HL,HL E,C HL,DE C,H A,L DE _A okopirovano do _HL a rovnez do _DE _A*2 _A*4 _A*5 _A*10 10*_A+_C prenos do _C vysledek do _A
D5 6F 26 00 5D 54 29 29 19 29 59 19 4C 7D D1 C9
pripravu pricteni cisla v plovouci tecce A,(HL) (HL),0 A Z HL 7,(HL) 7,(HL) HL Z BC BC,5 HL,BC B,C C,A HL A,(HL) 0 (HL),A #2FAF A,C BC prevzeti exponentu a bajt exponentu vynulovan je to cislo 0 ? ano:navrat adresovan bajt znamenka test na kladne/zaporne potom bit7 vzdy nastaven zpet na prvni bajt pri kladnem cisle hotovo uschova _BC bude zpracovano 5 bajtu nyni ukazatel za posledni bajt _B jako pocitadlo pro smycku exponent uschovan nastaveno CARRY pro vytvoreni 2.doplnku ukazatel o bajt zpet prevzeti bajtu a vytvoreni 2.doplnku ten zapsan zpet po zpracovani 5 bajtu hotovo obnoveni exponentu a _BC
7E 36 A7 C8 23 CB CB 2B C8 C5 01 09 41 4F 37
00
7E FE
05 00
2B 7E 2F CE 00 77 10 F8 79 C1 C9
E5 F5 4E
* *podpgm pro prevzeti dvou cisel v plov.tecce do registru *_HL ukazuje na 1.bajt prvniho,_DE na 1.bajt druheho cisla *1.cislo : m1..m5 -> _H' _B' _C' _C _B *2.cislo : n1..n5 -> _L' _D' _E' _D _E * push HL push AF uschova registru ld C,(HL) m1 prevzato
2FBD 2FBE 2FBF 2FC0 2FC1 2FC2 2FC3 2FC4 2FC5 2FC6 2FC7 2FC8 2FC9 2FCA 2FCB 2FCC 2FCD 2FCE 2FCF 2FD0 2FD1 2FD2 2FD3 2FD4 2FD5 2FD6 2FD7 2FD8 2FD9 2FDA 2FDB 2FDC 2FDD 2FDD 2FDD 2FDD 2FDD 2FDE 2FDF 2FE1 2FE3 2FE4 2FE5 2FE6 2FE8 2FEA 2FEC 2FED 2FEF 2FF1 2FF3 2FF4 2FF5 2FF8 2FF9 2FFA 2FFB 2FFD 2FFE 2FFF
23 46 77 23 79 4E C5 23 4E 23 46 EB 57 5E D5 23 56 23 5E D5 D9 D1 E1 C1 D9 23 56 23 5E F1 E1 C9
inc ld ld inc ld ld push inc ld inc ld ex ld ld push inc ld inc ld push exx pop pop pop exx inc ld inc ld pop pop ret
HL B,(HL) (HL),A HL A,C C,(HL) BC HL C,(HL) HL B,(HL) DE,HL D,A E,(HL) DE HL D,(HL) HL E,(HL) DE DE HL BC HL D,(HL) HL E,(HL) AF HL
m2 prevzato pri nasobeni/deleni ulozi znamenko m1 do _A m3 prevzato uschova m2,m3 m4 prevzato m5 prevzato _HL ukazuje na druhe cislo m1 do _D n1 prevzato m1,n1 ulozeno n2 prevzato n3 prevzato n2,n3 ulozeno prepnuti na alternativni registry _D'=n2 _E'=n3 _H'=m1 _L'=n1 _B'=m2 _C'=m3 normalni sada registru m4 prevzato m5 prevzato obnoveni _AF ukazatel zpet na 1.bajt 1.cisla
A7 C8 FE 30 C5 47 D9 CB CB CB D9 CB CB 10 C1 D0 CD C0 D9 AF 2E 57 5D D9
21 16
2D 1A 1B 1A 1B F2 04 30
00
* *podpgm pro posun cisla o maximalne 32 bitu *pro scitani (uprava exponentu) * SHIFTF and A pokud neni rozdil mezi exponenty ret Z pak ihned navrat cp 33 rozdil >32 ? jr NC,ADDZER ano:pricteni nuly push BC ld B,A rozdil exponentu k pocitani posunu SHIFTB exx sra L _L' rotovan doprava rr D _D' a _E' s CARRY rr E rotovany doprava exx rr D taktez _D a _E rr E rotovany doprava djnz SHIFTB znovu,dokud je rozdil 0 pop BC ret NC bez prenosu call #3004 jinak respektovano CARRY ret NZ bez preteceni doleva ADDZER exx xor A _A'=0 ld L,0 _L'=0 ld D,A _D'=0 ld E,L _E'=0 exx normalni registry
3000 3003 3004 3004 3004 3004 3005 3006 3007 3008 3009 300A 300C 300D 300E 300F 300F 300F 300F 3010 3013 3014 3014 3014 3014 3015 3016 3018 3018 3018 3018 3019 301A 301B 301C 301D 301E 301F 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 302A 302B 302B 302C 302D 302F 3031 3032 3033 3034 3035 3036
11 00 00 C9
ld DE,0 ret
vynulovano _DE
1C C0 14 C0 D9 1C 20 01 14 D9 C9
EB CD 6E 34 EB
1A B6 20 26
D5 23 E5 23 5E 23 56 23 23 23 7E 23 4E 23 46 E1 EB 09 EB 8E 0F CE 00 20 0B 9F 77 23 73 23 72
* *podpgm pro pricteni CARRY pri posunu cisla vpravo (viz vyse) * inc E nyni se budou prizpusobovat ret NZ jednotlive bajty cisla postupnou inc D inkrementaci,dokud nebude vysledek ret NZ nulovy exx inc E jr NZ,#300D inc D exx kdyz je pri navratu nastaveno ZERO ret vyskytlo se preteceni * *rozdil dvou cisel v plovouci tecce * SUBTRA ex DE,HL zamena ukazatelu call NEGIER znamenko cisla invertovano ex DE,HL ukazatele zpet a scitani * *podpgm pro secteni dvou cisel v plov.tecce * ADDIER ld A,(DE) test zda prvni bajt obou or (HL) cisel je 0 jr NZ,#303E ne * *scitani celych cisel <65535 * push DE ukazatel na 2.cislo uschovan inc HL ukazuje na 2.bajt 1.cisla push HL a uschova inc HL 3.bajt 1.cisla ld E,(HL) LSB do _E inc HL 4.bajt 1.cisla ld D,(HL) MSB do _D inc HL posunuti na 2.bajt 2.cisla inc HL (tj. na znamenko) inc HL ld A,(HL) prevzat do _A inc HL 3.bajt 2.cisla ld C,(HL) LSB do _C inc HL 4.bajt 2.cisla ld B,(HL) MSB do _B pop HL ukazatel na znamenko 1.cisla ex DE,HL do _DE, 1.cislo do _HL add HL,BC obe cisla sectena ex DE,HL vysledek do _DE (_HL ukazuje na znamenko 1.cisla adc (HL) secteni obou znamenek a CARRY rrca _A musi byt 0 adc 0 jinak je vysledek >65536 jr NZ,#303C coz je preteceni:skok sbc A spocteno znamenko vysledku ld (HL),A a zapsano inc HL ld (HL),E LSB inc HL ld (HL),D a MSB zapsan
3037 3038 3039 303A 303B 303C 303C 303D 303E 3041 3041 3041 3041 3041 3042 3043 3044 3045 3046 3049 304A 304B 304E 304F 3050 3052 3053 3054 3055 3056 3057 305A 305D 305E 305F 3060 3061 3062 3063 3064 3065 3066 3068 3069 306A 306B 306C 306D 306E 306E 306E 306F 3070 3071 3072 3074 3076 3079 307A 307C
2B 2B 2B D1 C9 * 2B D1 CD 93 32
HL HL HL DE
ukazatel na 1.bajt vysledku >STKEND< do _DE ukazatel na 1.bajt 1.cisla ukazatel na 1.bajt 2.cisla obnoveny obe cisla (vsech 5 bajtu kazdeho) na zasobnik kalkulatoru "integer") ulozen ukazatel na dalsi cislo ukazatel na 1.scitanec i na 2. ulozeny 1.cislo upraveno pro scitani exponent do _B zamena pro praci s 2.cislem jeho uprava pro scitani exponent do _C porovnani;1.cislo je mensi nez 2. ? ano jinak oba exponenty a ukazatele zameneny vetsi exponent uschovan rozdil exponentu pro posunuti doprava obe cisla prevzata z calcstacku probehne uprava mantis obnoven vetsi exponent _HL ukazuje na vysledek zapsan exponent vysledku uschova ukazatele dva spravne bajty do _HL a pricteny vysledek uschovan a prevzaty dalsi bajty pro scitani vysledek do _DE' 5.bajt v _H' secten s _L' vysledek do _L' pokud preteceni pro scitani dvou kladnych cisel nebo bez preteceni pri dvou zapornych,musi se vysledek posunout o misto doprava vysledek do _DE a _DE' ukazatel na exponent test,zda je nutne posunuti ne posunuti o jedno misto doprava exponent +1 pokud preteceni:chyba test na zaporny vysledek
dec HL pop DE call #3293 * *secteni dvou cisel (ne * exx push HL exx push DE push HL call #2F9B ld B,A ex DE,HL call #2F9B ld C,A cp B jr NC,#3055 ld A,B ld B,C ex DE,HL push AF sub B call #2FBA call SHIFTF pop AF pop HL ld (HL),A push HL ld L,B ld H,C add HL,DE exx ex DE,HL adc HL,BC ex DE,HL ld A,H adc L ld L,A rra xor L exx ex pop rra jr ld call inc jr exx
D9 E5 D9 D5 E5 CD 47 EB CD 4F B8 30 78 41 EB F5 90 CD CD F1 E1 77 E5 68 61 19 D9 EB ED EB 7C 8D 6F 1F AD D9 EB E1 1F 30 3E CD 34 28 D9
9B 2F 9B 2F 03
BA 2F DD 2F
4A
08 01 DD 2F 23
307D 307E 3080 3081 3082 3083 3084 3086 3087 3089 308A 308A 308B 308C 308D 308F 3090 3091 3092 3093 3095 3096 3097 3098 309A 309C 309D 309D 309E 309F 30A2 30A3 30A4 30A5 30A6 30A9 30A9 30A9 30AA 30AC 30AD 30AE 30B1 30B2 30B4 30B6 30B7 30B9 30BA 30BC 30BE 30BF 30C0 30C0 30C0 30C0 30C3 30C4 30C5 30C6
7D E6 80 D9 23 77 2B 28 1F 7B ED 44 3F 5F 7A 2F CE 57 D9 7B 2F CE 5F 7A 2F CE 30 1F
ld and exx inc ld dec jr ld neg ccf ld ld cpl adc ld exx ld cpl adc ld ld cpl adc jr rra exx inc jp exx ld exx xor jp * *podpgm pro push ld ld ld ld add jr rl rla jr add jr djnz pop ret * *podpgm pro * call ret inc xor
prevezme znamenko a ponecha jen bit7 tento bit ulozi do 2.bajtu vysledku ukazuje na 1.bajt kladny vysledek:skok prevezme prvni bajt a vytvori 2.doplnek CARRY invertovano pro dalsi tvorbu 2.doplnku vytvoreny bajt predan zpet prevzat 2.bajt invertovan souctem vznikne 2.doplnek predan zpet pro dalsi dva bajty je postup totozny
00
00
00 07
bez CARRY:hotovo jinak je vysledek presne 2^xx mantisa nastavena na 0.5 exponent +1 prekrocen rozsah:chybove hlaseni posledni bajt zapsan smazano CARRY
D9 34 CA AD 31 D9 57 D9 AF C3 55 31 C5 06 7C 4D 21 29 38 CB 17 30 19 38 10 C1 C9
10 00 00 0A 11 03 02 F3
vypocet _HL=_DE*_HL BC B,16 _B jako pocitadlo pro 16 bitu A,H MSB do _A C,L a LSB do _C HL,0 _HL zpocatku nulove HL,HL _HL *2 C,#30BE CARRY nastaveno:preteceni C prave nejvyssi bajt do CARRY a ostatni posunuty NC,#30BC bit byl 0:skok HL,DE jinak pricteno _DE C,#30BE skok pri preteceni #30B1 probehlo 16 krat ? BC ano:konec pripravu na nasobeni nebo deleni #34E9 C HL (HL) cislo je 0 ? ano:navrat adresace znamenka v _A vytvoreno znamenko vysledku pro shodna je 0, jinak #FF
CD E9 34 D8 23 AE
30C6 30C8 30C9 30CA 30CA 30CA 30CA 30CB 30CC 30CE 30CF 30D0 30D1 30D4 30D5 30D6 30D7 30DA 30DB 30DC 30DD 30DE 30E1 30E2 30E3 30E5 30E6 30E7 30E9 30EA 30ED 30EE 30EF 30EF 30F0 30F3 30F4 30F7 30F8 30F9 30FA 30FB 30FC 30FD 3100 3101 3103 3104 3107 3108 3109 310B 310C 310D 310F 3110 3112 3114 3114 3116
CB FE 2B C9
set 7,(HL) dec HL ret * *podpgm pro * MULTIP ld or jr push push push call ex ex ld call ld xor ld pop call ex pop jr ld or jr ld call pop ret * pop call xor call ret exx push exx push ex call ex jr push call ld and sbc exx push sbc exx ld jr * jr add
realizaci nasobeni A,(DE) (HL) NZ,#30F0 DE HL DE #2D7F DE,HL (SP),HL B,C #2D7F A,B C C,A HL #30A9 DE,HL HL C,#30EF A,D E NZ,#30EA C,A #2D8E DE DE #3293 A #30C0 C HL DE DE,HL #30C0 DE,HL C,#315D HL #2FBA A,B A HL,HL HL HL,HL B,33 #3125 NC,#311B HL,DE test,zda jsou oba prvni bajty 0 ne ano:nasobeni cisel "integer" ukazatel na 2.,1. a znovu 2.cislo uschovany cislo do _DE,znamenko do _C prevezme cislo do _HL a zameni s ukazatelem na 2.cislo znamenko 1.cisla do _B prevezme druhe cislo znamenko vysledku stanoveno a kopie do _C 1.cislo do _HL nasobeni _HL=_DE*_HL vysledek do _DE ukazatel na 1.cislo preteceni test,zda je vysledek 0 ne jinak exponent=0 cislo ulozeno na calcstack ukazatel na >STKEND< obnoveni ukazatele na 2.cislo obe cisla na calcstack _A=0 prevzeti znamenka 1.cisla pokud je 1.cislo=0:hotovo ulozen ukazatel na dalsi cislo zamena pro upravu 2.cisla ukazatele zpet 2.cislo=0:skok uschova ukazatele na vysledek prevezme obe cisla z calcstacku m5 do _A CARRY smazano pro odcitani _HL predem nulovano pro vysledek prepnuti registru pro uschovu m1 a n1 (v_HL') _HL' je predem nastaveno na 0 normalni registry _B jako pocitadlo skok na smycku pro nasobeni bit nenastaven,zadne pricitani jinak nasobenec v _DE,_DE'
1A B6 20 D5 E5 D5 CD EB E3 41 CD 78 A9 4F E1 CD EB E1 38 7A B3 20 4F CD D1 C9 D1 CD AF CD D8 D9 E5 D9 D5 EB CD EB 38 E5 CD 78 A7 ED D9 E5 ED D9 06 18
22
7F 2D
7F 2D
A9 30 0A 01 8E 2D
93 32 C0 30
C0 30 5A BA 2F 62 62 21 11
30 05 19
3117 3118 311A 311B 311C 311E 3120 3121 3123 3125 3126 3128 312A 312B 312D 312E 3130 3131 3132 3133 3134 3135 3136 3137 3138 313A 313B 313C 313D 313D 313E 313F 3140 3143 3145 3146 3147 3149 314B 314C 314E 314F 3151 3152 3153 3154 3155 3155 3155 3155 3157 3158 3159 315B 315D 315E 315F 3160 3163 3164
D9 ED D9 D9 CB CB D9 CB CB D9 CB CB D9 CB 1F 10 EB D9 EB D9 C1 E1 78 81 20 A7 3D 3F 17 3F 1F F2 30 A7 3C 20 38 D9 CB D9 20 77 D9 78 D9
5A 1C 1D 1C 1D 18 19 19 E4
01
exx adc exx exx rr rr exx rr rr exx rr rr exx rr rra djnz ex exx ex exx pop pop ld add jr and dec ccf * rla ccf rra jp jr and inc jr jr exx bit exx jr ld exx ld exx
pricten k _HL,_HL' HL,DE normalni sada registru H L H L B C C #3114 DE,HL DE,HL BC HL A,B C NZ,#313B A A pocet bitu jeste neni zpracovan vysledek z _HL,_HL' preveden do _DE,_DE' obnoveny oba exponenty (m1,n1) a ukazatel na exponent oba exponenty secteny pokud je vysledek nula, je exponent zkorigovan pomoci #80 spravny exponent bude stanoven P,#3146 NC,#31AD A A NZ,#3151 C,#3151 7,D NZ,#31AD (HL),A A,B kladny,bez preteceni zaporny a CARRY=0:chyba jinak je CARRY smazano a exponent je hotov je-li nenulovy,vse O.K.,jinak testovano preteceni;v poradku:skok pokud je CARRY=0 a je nastaven bit7 _D' pak chyba preteceni exponent ulozen pro normalizaci mantisy prevzat 5.bajt _BC',_C a _A rotovany doprava pro presun dalsiho bitu do CARRY pro scitani ve smycce _HL' a _HL pri kazdem pruchodu posunuty o 1 bit doprava
46 31 68 08 06 7A 5C
30 7E A7 3E 28 AF D9 A2 CD 07 77
15 80 01
FB 2F
* *normalizace mantisy (pri vsech pocetnich rutinach) * TSTNOR jr NC,NORMAL na normalizaci ld A,(HL) pri CARRY=1 zpracovano podteceni and A test zda _A=0 ld A,#80 (pro tento pripad pripraven exponent) jr Z,#315E _A bylo 0 xor A jinak _A nulovano exx pro 2^-128 exponent na 1 and D pro 0 exponent call #2FFB (nulovani registru) rlca jiz pripraven ld (HL),A zapsani exponentu
3165 3167 3168 3169 316A 316C 316C 316E 316F 3171 3172 3174 3175 3177 3179 317A 317C 317E 317F 3180 3182 3184 3186 3187 3189 318C 318E 318F 3191 3192 3193 3195 3196 3197 3198 3199 319A 319B 319C 319D 319F 31A0 31A1 31A2 31A3 31A4 31A5 31A6 31A7 31A8 31A9 31AA 31AB 31AC 31AD 31AD 31AE 31AF 31AF 31AF
38 2E 23 77 2B 18 29 06 D9 CB D9 20 07 CB CB D9 CB CB D9 35 28 10 18 17 30 CD 20 D9 16 D9 34 28 E5 23 D9 D5 D9 C1 78 17 CB 1F 77 23 71 23 72 23 73 E1 D1 D9 E1 D9 C9 CF 05 20 7A 12 13 12 13 12 D7 EA D7 0C 04 30 07 80 18
jr inc ld dec jr * NORMAL ld exx bit exx jr rlca rl rl exx rl rl exx dec jr djnz jr rla jr call jr exx ld exx inc jr push inc exx push exx pop ld rla rl rra ld inc ld inc ld inc ld pop pop exx pop exx ret * rst DEFB * *podpgm pro *
C,#3195 HL (HL),A HL #3195 B,32 7,D NZ,#3186 E D E D (HL) Z,#3159 #316E #315D NC,#3195 #3004 NZ,#3195 D,#80 (HL) Z,#31AD HL HL DE BC A,B (HL) (HL),A HL (HL),C HL (HL),D HL (HL),E HL DE HL
pri 2^-128:skok jinak 0 take do 2.bajtu ukazatel zpet na prvni bajt vysledek zapsan najvice 32 posunu pro normalizaci mantisy v _DE,_DE' probihaji posuny az do nastaveni bitu7 v _D'
exponent -1 je-li exponent < -129,zmena na -128 smycka jeste neni ukoncena:skok bit7 nenabyl hodnoty 1:vysledek je 0 pripadne CARRY pricteno bez preteceni jinak mantisa na .5 exponent +1 preteceni:chyba uschova ukazatele na vysledek _HL ukazuje na bajt znamenka vysledek z _DE prenesen do _BC bit znamenka je na sve misto (bit7 nejvyssiho bajtu vysledku) prekopirovan a ulozen dalsi bajty vysledku ulozeny obnoven ukazatel na vysledek a na 2.cislo ukazatel na dalsi cislo do _HL'
16
ERROUT #05
realizaci deleni
31AF 31B2 31B3 31B4 31B7 31B9 31BA 31BD 31BE 31BF 31C0 31C1 31C2 31C3 31C6 31C7 31C8 31C9 31CA 31CB 31CC 31CD 31CE 31D0 31D2 31D2 31D3 31D5 31D6 31D8 31DA 31DB 31DC 31DD 31DF 31E0 31E2 31E2 31E4 31E5 31E7 31E8 31EA 31EB 31EC 31EE 31EF 31F0 31F2 31F3 31F5 31F6 31F8 31F9 31F9 31FA 31FB 31FE 31FF 3201
CD EB AF CD 38 EB CD D8 D9 E5 D9 D5 E5 CD D9 E5 60 69 D9 61 68 AF 06 18 17 CB D9 CB CB D9 29 D9 ED D9 38 ED D9 ED D9 30 19 D9 ED D9 A7 18 A7 ED D9 ED D9
93 32 C0 30 F4 C0 30
BA 2F
DF 10 * 11 11 10
call ex xor call jr ex call ret exx push exx push push call exx push ld ld exx ld ld xor ld jr rla rl exx rl rl exx add exx adc exx jr * sbc exx sbc exx jr add exx adc exx and jr and sbc exx sbc exx * scf inc jp push jr
#3293 DE,HL A #30C0 C,#31AD DE,HL #30C0 C HL DE HL #2FBA HL H,B L,C H,C L,B A B,#DF #31E2 C C B HL,HL HL,HL C,#31F2 HL,DE HL,DE NC,#31F9 HL,DE HL,DE A #31FA A HL,DE HL,DE
obe cisla na zasobnik zamena ukazatelu _A=0 pro prevzeti znamenka 1.cisla uprava pro deleni pokud delitel je 0:chyba ukazatele zpet uprava delence pokud je tento nulovy:vysledek 0 uschova ukazatele na dalsi cislo ukazatel na delitele ukazatel na delence uschovany cisla z calcstacku do registru uschovany oba exponenty celociselna cast delence z _BC',_BC okopirovana do _HL,_HL'
zbytek delence v _HL,_HL' nasoben 2 pritom bude pro cely 32-bitovy vysledek respektovano CARRY na zkousku odecten delitel od zbytku delence vysledek kladny jinak byl delitel vetsi nez delenec delitel puvodni smazani CARRY dale ve smycce smazani CARRY delitel pro plnou presnost znovu nascitan (ve smycce posunu)
6A 10 52 52 0F 5A 08 52 52
37 04 FA D2 31 F5 28 E1
B M,#31D2 AF Z,#31E2
nastaven 1 bit v podilu pocitadlo -(-1) jeste neni hotovo uschova CARRY zde udela marny pokus ziskat dalsi bit do vysledku
3201 3202 3203 3204 3205 3206 3207 3209 320A 320C 320D 320E 320F 3210 3211 3214 3214 3214 3214 3215 3216 3217 3219 321B 321D 321F 3221 3221 3223 3223 3225 3226 3227 3228 322A 322B 322C 322D 322E 3230 3232 3233 3234 3236 3237 3238 323A 323B 323D 323F 323F 3241 3242 3243 3245 3246 3247 3248 3249 324A
5F 51 D9 59 50 F1 CB 18 F1 CB 18 D9 C1 E1 78 91 C3 3D 31
ld ld exx ld ld pop rr pop rr exx pop pop ld sub jp * *podpgm pro * ld and ret cp jr ld ld jr * cp jr inc inc inc ld and dec or dec jr ld xor dec jr ld inc ld dec ld jr * jr push cpl add inc ld inc ld dec dec
oddeleni celociselne casti promenne A,(HL) A Z #81 NC,#3221 (HL),0 A,32 #3272 #91 NZ,#323F HL HL HL A,#80 (HL) HL (HL) HL NZ,#3233 A,#80 (HL) HL NZ,#326C (HL),A HL (HL),#FF HL A,24 #3272 NC,#326D DE #91 HL D,(HL) HL E,(HL) HL HL prevzeti exponentu pokud je nulovy jde o cele cislo exponent musi byt >#81 jinak je celociselna cast nulovana 32 bitu v _A je exponent,cislo testovano na -65536 nemuze byt -65536 adresovan 4.bajt pro test na -65536 z neho pouze bit7 testovan dva dalsi bajty musi byt pro -65536 take nulove prvni<>0:konec testu znamenkovy bit musi byt 1 a zbytek bajtu 0 (_HL opet ukazuje na exponent) ne -65536 jinak bude cislo -65536 to je #91 #80 #00 #00 #00 pomoci #00 #FF #00 #00 #00 zmeneno na "-1" ; to je chyba !!! 24 bitu bude vynulovano pokud exponent >#92:skok uschovana hodnota >STKEND< exponent zmenen do mezi 0 (puvodne 144) ..15 (puvodne 129) druhy bajt predan do _D treti do _E _HL nastavi zpet na exponent
7E A7 C8 FE 30 36 3E 18
81 06 00 20 51
FE 91 20 23 23 23 3E A6 2B B6 2B 20 3E AE 2B 20 77 23 36 2B 3E 18 1A
80
03 80 36 FF 18 33
30 2C D5 2F C6 91 23 56 23 5E 2B 2B
324B 324D 324F 3251 3252 3254 3256 3257 3258 325A 325B 325D 325E 3260 3261 3263 3265 3267 326A 326B 326C 326C 326C 326C 326D 326F 3270 3270 3272 3272 3273 3274 3275 3276 3278 327A 327C 327E 3280 3281 3283 3285 3287 3288 328A 328C 328E 328F 3290 3291 3292 3293 3293 3293 3293 3293 3296 3297 3297 3297
0E CB 28 0D CB 06 90 80 38 5A 16 90 28 47 CB CB 10 CD D1 C9
00 7A 01 FA 08 04 00 07 3A 1B FA 8E 2D
ld bit jr dec set ld sub add jr ld ld sub jr ld srl rr djnz call pop ret
C,0 7,D Z,#3252 C 7,D B,8 B B C,#325E E,D D,0 B Z,#3267 B,A D E #3261 #2D8E DE
implicitne pozn:kladne cislo test,zda je cislo kladne ano pro zaporne je _C=#FF nastaven bit "numericky" v _D test,zda _A>=8 (tedy zmena 1 bajtu) pokud bude muset zmenit 2 bajty:skok jeden bajt do _E a _D je smazano pro nutne posuny _A do mezi 1..7 pokud 0:bez posunu _B pocita posuny _D a _E posouvany,dokud nebude _B=0 spravny vysledek ulozi na calcstack >STKEND< obnoven v _DE 'X' prevezme exponent odecte #A0 navrat kdyz des.tecka na konci (jen "integer") jinak je zbytek invertovan pro urceni poctu nulovych bitu uschovan >STKEND< ukazatel _HL nastaven na 5.bajt pocet bitu,ktere budou nulovany delen 8 tim spocita,kolik je to celych bajtu pokud ani jeden:skok jinak vynulovano _B bajtu pocet zbyvajicich bitu v _A je nulovy:skok jinak do _B pro odpocitavani v _A vytvorena maska v ktere je zprava nulovan potrebny pocet (_B) bitu vytvorene nuly preneseny do bajtu a vysledek v _A je zapsan obnoveny ukazatele na exponent a na >STKEND<
7E D6 A0 F0 ED 44 D5 EB 2B 47 CB CB CB 28 36 2B 10 E6 28 47 3E CB 10 A6 77 EB D1 C9
* *zjisti velikost hodnoty * ld A,(HL) sub #A0 ret P neg push ex dec ld srl srl srl jr ld dec djnz and jr ld ld sla djnz and ld ex pop ret DE DE,HL HL B,A B B B Z,3283 (HL),0 HL #327E 7 Z,#3290 B,A A,#FF A #328A (HL) (HL),A DE,HL DE
38 38 38 05 00 FB 07 09 FF 27 FC
CD 96 32 EB
* *podpgm pro preneseni dvou celych cisel *ve tvaru cisla v plov.tecce na zasobnik kalkulatoru * call #3296 timto probehne 2krat,ale zamena ex DE,HL ukazatelu zajisti,ze nejdriv pro jedno,pak pro druhe(2.prubeh:puv.uk.) * *podpgm pro preneseni celeho cisla na calcstack
3297 3297 3297 3298 3299 329A 329B 329E 329F 32A0 32A1 32A2 32A3 32A5 32A6 32A7 32A9 32AA 32AB 32AD 32AE 32AF 32B1 32B2 32B3 32B4 32B6 32B8 32BA 32BC 32BD 32BE 32BF 32C0 32C1 32C2 32C3 32C4 32C5 32C5 32C5 32C5 32C5 32C5 32C5 32C5 32C8 32CC 32CE 32D3 32D7 32D7 32D7 32D7 32D7 32D9 32DB 32DD 32DF 32E1
*ve tvaru cisla v plov.tecce * 7E ld A,(HL) pokud prvni bajt A7 and A neni nulovy,nejde o cislo "integer": C0 ret NZ pak navrat D5 push DE jinak uschovan ukazatel CD 7F 2D call #2D7F znamenko do _C,cislo do _DE AF xor A nulovani _A 23 inc HL paty 77 ld (HL),A 2B dec HL a ctvrty bajt 77 ld (HL),A nulovany 06 91 ld B,#91 do _B #91 pro max. 16 bitu cisla 7A ld A,D pokud je _D=0 A7 and A bude treba prenest jen 8 bitu 20 08 jr NZ,#32B1 vice nez 8:skok B3 or E stejny test pro _E 42 ld B,D nulovano _B 28 10 jr Z,#32BD cele cislo je 0:skok 53 ld D,E _E->_D 58 ld E,B a do _E nula 06 89 ld B,#89 to je exponent pri zprac.max.8 bitu EB ex DE,HL ukazatel do _DE,cislo do _HL 05 dec B pri kazdem posunu exponent -1 29 add HL,HL a cislo naopak *2 30 FC jr NC,#32B2 az do preteceni CB 09 rrc C znamenko do CARRY CB 1C rr H a preneseno do cisla CB 1D rr L EB ex DE,HL zamena cisla a ukazatele 2B dec HL 73 ld (HL),E _E zapsano do tretiho 2B dec HL 72 ld (HL),D _D do druheho bajtu 2B dec HL 70 ld (HL),B exponent do prvniho D1 pop DE obnoveni >STKEND< C9 ret * *============================================================ * *PODPGMY A TABULKY KALKULATORU * *tabulka konstant * 00 B0 00 DEFB #00 #B0 #00 nula 40 B0 00 01 DEFB #40 #B0 #00 #01 jedna 30 00 DEFB #30 #00 .5 F1 49 0F DA DEFB #F1 #49 #0F #DA #A2 PI/2 40 B0 00 0A DEFB #40 #B0 #00 #0A deset * *tabulka adres vykonnych rutin,prislusnych "operacnim kodum" *jejim prostrednictvim jsou vykonavany prikazy kalkulatoru * 8F 36 DEFW #368F 00:skok,kdyz pravda ;jrt 3C 34 DEFW #343C 01:zamena ;swap A1 33 DEFW #33A1 02:smazani polozky ;drop 0F 30 DEFW SUBTRA 03:odcitani ;sub CA 30 DEFW MULTIP 04:nasobeni ;multi AF 31 DEFW #31AF 05:deleni ;divide
32E3 32E5 32E7 32E9 32EB 32ED 32EF 32F1 32F3 32F5 32F7 32F9 32FB 32FD 32FF 3301 3303 3305 3307 3309 330B 330D 330F 3311 3313 3315 3317 3319 331B 331D 331F 3321 3323 3325 3327 3329 332B 332D 332F 3331 3333 3335 3337 3339 333B 333D 333F 3341 3343 3345 3347 3349 334B 334D 334F 3351 3353 3355 3357 3359
51 1B 24 3B 3B 3B 3B 3B 3B 14 2D 3B 3B 3B 3B 3B 3B 9C DE BC 45 6E 69 DE 74 B5 AA DA 33 43 E2 13 C4 AF 4A 92 6A AC A5 B3 1F C9 01 C0 A0 86 C6 7A 06 F9 9B 83 14 A2 4F 97 49 1B 2D 0F
38 35 35 35 35 35 35 35 35 30 35 35 35 35 35 35 35 35 35 34 36 34 36 35 36 37 37 37 38 38 37 37 36 36 38 34 34 34 34 34 36 35 35 33 36 36 33 36 35 34 36 37 32 33 2D 32 34 34 34 34
DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW DEFW
#3851 #351B #3524 #353B #353B #353B #353B #353B #353B ADDIER #352D #353B #353B #353B #353B #353B #353B #359C #35DE #34BC #3645 #346E #3669 #35DE #3674 #37B5 #37AA #37DA #3833 #3843 #37E2 #3713 #36C4 #36AF #384A #3492 ABSOLU #34AC #34A5 #34B3 #361F #35C9 #3501 DOUBLE #36A0 #3686 #33C6 #367A #3506 #34F9 #369B #3783 #3214 #33A2 #2D4F #3297 #3449 #341B #342D #340F
06:2.mocnina ;^2 07:log. nebo ;OR 08:log. a ;AND 09:nerovno ;<>? 0A:mensi nez ;<? 0B:nerovno ($) ;$<>$? 0C:mensi nebo rovno ;<=? 0D:vetsi nebo rovno ;>=? 0E:rovno ($) ;$=$? 0F:scitani ;add 10:retezec AND cislo ;$& 11:mensi neb rovno($);$<=$? 12:vetsi neb rovno($);$>=$? 13:nerovno ($) ;$<>$? 14:vetsi nez ($) ;$>$? 15:mensi nez ($) ;$<$? 16:rovno ($) ;$=$? 17:scitani retezcu ;$+$ 18:VAL$ ;val$ 19:USR$ ;usr$ 1A:read in ;can->mem 1B:negace ;neg 1C:CODE ;code 1D:VAL ;val 1E:LEN ;len 1F:sinus ;sin 20:kosinus ;cos 21:tangens ;tan 22:arkussinus ;asn 23:arkuskosinus ;acs 24:arkustangens ;atn 25:prir.logaritmus ;ln 26:exponent (e^x) ;exp 27:integer ;int 28:2.odmocnina ;sqr 29:znamenko ;sgn 2A:absolutni hodnota ;abs 2B:PEEK ;peek 2C:IN ;in 2D:start mc pgmu ;usr 2E:STR$ ;str$ 2F:CHR$ ;chr$ 30:logicka negace ;not 31:zdvoji vrchol ;dup 32:deleni modulo ;mod 33:relativni skok ;jr 34:hodn.na zasobnik ;number->stack 35:odpocit.smycka ;djnz 36:mensi nez nula ;<0? 37:vetsi nez nula ;>0? 38:navrat z kalk. ;navrat 39:redukce argumentu ;arg 3A:celocis.cast+zaokr;int.ro 3B:operace z >BREG< ;fp-calc-2 3C:exp.tvar na FP ;exp->fp 3D:int.tvar na FP ;int->fp 3E:polynomicky rozvoj;polynom 3F:nula na zasobnik ;0->stack 40:z vrcholu do mem ;stack->mem 41:z mem na vrchol ;mem->stack
335B 335B 335B 335B 335B 335B 335B 335B 335B 335B 335B 335B 335B 335E 335E 335F 335F 3362 3363 3364 3365 3365 3369 3369 336A 336B 336C 336D 336E 336E 3371 3372 3374 3375 3376 3377 3378 337A 337B 337C 337E 3380 3380 3382 3384 3385 3388 3389 338A 338B 338C 338D 338E 3391 3393 3394 3395 3396 3397 339A
* *KALKULATOR * *normalne volan prostrednictvim "rst CALSW" (#28) *za timto volanim nasleduje jeden nebo vice bajtu,ktere *na miste instrukce predstavuji "(pseudo)operacni kody" *operace se tykaji hodnot na vrcholu zasobniku kalkulatoru *(hodnota tvorena 5 bajty),ktere predstavuji *cislo v plovouci tecce nebo parametry retezce *dale pouziva kalkulator pomocnou pamet pro ulozeni dilcich *vysledku apod. Je oznacena mem0..mem5 a kazda ma 5 bajtu * CD BF 35 CALC call #35BF do _HL adresa posledni polozky na zasobniku,do _DE hodnota >STKEND< 78 ld A,B prosty ofset operace,nebo pri rekurzivnim volani operand 32 67 5C ld (BREG),A zapsan do >BREG< D9 CALC2 exx navratova adresa do _HL' E3 ex (SP),HL CALC2 je vstupnim bodem pro D9 exx rekurzivni volani,pri kterem se nemeni >BREG< ED 53 65 5C CLOOP ld (STKEND),DE vstup pri zpracovani jednotlivych oper.kodu,proto nejprve novy >STKEND< D9 exx druha sada registru 7E ld A,(HL) prevzeti aktualniho oper.kodu 23 inc HL ukazatel na nej +1 E5 push HL a je uschovan A7 and A test,zda jde o prosty kod nebo zda je treba vydelit z vicenasobneho F2 80 33 jp P,#3380 prosty:skok 57 ld D,A uschova kodu do _D E6 60 and #60 ponecha jen bit5 a bit6 0F rrca a presune je do bitu1 a bitu2 0F rrca 0F rrca 0F rrca C6 7C add #7C pricteno 2*#3E jako zaklad 6F ld L,A pro tabulku do _L 7A ld A,D vykryty bit0..bit4 E6 1F and #1F 18 0E jr #338E a na vyhledani adresy * FE 18 cp #18 pokud operace jen s jednim cislem 30 08 jr NC,#338C pak skok (napr. SIN) D9 exx pri operaci se dvema ("+" ap.) 01 FB FF ld BC,#FFFB musi _HL ukazovat na prvni 54 ld D,H a _DE na druhy operand 5D ld E,L 09 add HL,BC D9 exx druha sada registru 07 rlca _A*2 pro adresu skoku 6F ld L,A toto jako ofset do _HL 11 D7 32 ld DE,#32D7 adresa tabulky do _de 26 00 ld H,0 19 add HL,DE spocitano umisteni adresy pro 5E ld E,(HL) skok na vykonnou rutinu 23 inc HL a tato adresa skoku prepsana 56 ld D,(HL) do _DE 21 65 33 ld HL,CLOOP navratova adresa do rutiny kalk. E3 ex (SP),HL polozena na syst.zasobnik
339B 339B 339C 339D 33A1 33A2 33A2 33A2 33A2 33A2 33A2 33A2 33A2 33A2 33A2 33A3 33A6 33A7 33A9 33A9 33A9 33A9 33A9 33AA 33AB 33AE 33B1 33B2 33B3 33B4 33B4 33B4 33B4 33B8 33BB 33BF 33C0 33C0 33C0 33C0 33C0 33C3 33C5 33C6 33C6 33C6 33C6 33C6 33C6 33C6 33C7 33C8 33CB 33CC 33CD 33CE 33CF 33CF 33D0 33D1
D5 D9 ED 4B 66 5C C9
a obnoven ukazatel v _HL push DE ulozena adresa vykonne rutiny exx normalni sada ld BC,(BREG-1) >BREG< do _B ret skok na prislusnou rutinu !
* *podpgm pro smazani posledni hodnoty ze zasobniku (#02;drop) *vykona se provedenim "ret" na adrese #33A1,protoze *se pouze snizi o 5 bajtu ukazatel v _HL,tzn.presune se *na predposledni hodnotu. dosavadni hodnota tedy jiz *pro kalkulator neexistuje a bude dalsimi operacemi prepsana * *podpgm pro provedeni operace (#3B) * F1 pop AF odstraneni navratove adresy CLOOP 3A 67 5C ld A,(BREG) prevzeti operacniho kodu D9 exx 2.sada registru 18 C3 jr #336C stanoveni adresy a provedeni * *podpgm pro test,zda je jeste k dispozici potrebnych *5 bajtu pameti (tj.misto pro cislo) * D5 SPACE5 push DE E5 push HL uschova registru 01 05 00 ld BC,5 test pro 5 bajtu CD 05 1F call #1F05 proveden E1 pop HL D1 pop DE obnoveni registru C9 ret * *podpgm pro preneseni cisla na zasobnik * ED 5B 65 5C ld DE,(STKEND) od bajtu v >STKEND< CD C0 33 call DOUBLE probehne prevedeni ED 53 65 5C ld (STKEND),DE nove nastaveni >STKEND< C9 ret * *podpgm pro ulozeni cisla na zasobnik *(take pro kod #31) * CD A9 33 DOUBLE call SPACE5 test,zda je misto ED B0 ldir probehne prevedeni C9 ret * *podpgm pro ulozeni cisla,ktere nasleduje primo za *oper.kodem #34; prvni je exponent,ktery take udava *bitem6 a bitem7 pocet bajtu mantisy,ktere nasleduji *pripadny zbytek je doplnen nulami * 62 ld H,D _HL nastaveno na novou 6B ld L,E posledni hodnotu CD A9 33 call SPACE5 test,zda misto D9 exx ukazatel na dalsi oper.kod E5 push HL je uschovan do _HL' D9 exx E3 ex (SP),HL zamenou ukazatelu na op.kod a na vysledek C5 push BC uschova _BC 7E ld A,(HL) prevzat exponent E6 C0 and #C0 a pocet nasledujicich bajtu
33D3 33D4 33D5 33D6 33D7 33D8 33DA 33DC 33DD 33DE 33E0 33E1 33E3 33E4 33E5 33E6 33E8 33EA 33EB 33EC 33ED 33EE 33EF 33F0 33F1 33F2 33F3 33F4 33F5 33F7 33F7 33F7 33F7 33F7 33F8 33F9 33FA 33FB 33FE 3401 3401 3402 3403 3404 3406 3406 3406 3406 3406 3407 3408 3409 340A 340B 340D 340E 340F 340F 340F 340F
07 07 4F 0C 7E E6 20 23 7E C6 12 3E 91 23 13 06 ED C1 E3 D9 E1 D9 47 AF 05 C8 12 13 18
3F 02 50 05
00 B0
FA
rlca rlca ld inc ld and jr inc ld add ld ld sub inc inc ld ldir pop ex exx pop exx ld xor dec ret ld inc jr
spocitan pomoci deleni #40 C,A C A,(HL) #3F NZ,#33DE HL A,(HL) #50 (DE),A A,5 C HL DE B,0 BC (SP),HL HL B,A A B Z (DE),A DE #33F1 vysledek do _C a zvysen o 1 znovu prevzat exponent z neho bit0..bit5 pokud <>0 (jinak z dalsiho bajtu) stanoven spravny exponent a zapsan pocet nul pro doplneni spocitan v _A _HL a _DE na 1.bajt _BC jako pocitadlo preneseni _BC vraceno ukazatel na vysledek zpet do _HL ukazatel na oper.kod ze syst.zasobniku do _HL' _B jako pocitadlo pro nuly nulovani _A pocitadlo -1 neni treba ukladat (jiz) zadne 0 zapsani jedne nuly ukazatel (>STKEND<) zvysen
A7 C8 F5 D5 11 00 00 CD C8 33 D1 F1 3D 18 F2
4F 07 07 81 4F 06 00 09 C9
D5
* *podpgm pro vyhledani konstanty v tabulce kalkulatoru *cislo musi byt v _A * and A kdyz hledana konstanta nelezena ret Z pak navrat push AF uschova pocitadla push DE _DE rovnez ld DE,0 naslepo prebira konstanty z tabulky call #33C8 dokud _HL nedosahne spravne adresy * pop DE znovu obnoveno _DE pop AF a _A dec A pocitadlo -1 jr #33F8 test,zda nalezeno * *podpgm pro vypocet adresy 5bajtoveho useku v pameti kalk. *tzn.vyhledani mem0..mem5 * ld C,A cislo mem do _C rlca rlca krat 4 add C +_C = 5*_C ld C,A ld B,0 vysledek do _BC add HL,BC a pricten k _HL ret * *preneseni hodnoty z pameti kalkulatoru (mem) na zasobnik * push DE uschova ukazatele na vysledek
3410 3413 3416 3419 341A 341B 341B 341B 341B 341C 341D 341E 341F 3422 3423 3426 3429 342A 342B 342C 342D 342D 342D 342D 342D 342E 342F 3432 3435 3436 3439 343A 343B 343C 343C 343C 343C 343C 343E 343F 3440 3441 3442 3443 3444 3445 3447 3448 3449 3449 3449 3449 3449 344A 344D 344D 344D 344D 344E 344F
2A 68 5C CD 06 34 CD C0 33 E1 C9
bazova adresa oblasti mem vyhledani adresy memx probehne preneseni ukazatel na 1.bajt nove hodnoty na zasobniku
62 6B D9 E5 21 C5 32 D9 CD F7 33 CD C8 33 D9 E1 D9 C9
E5 EB 2A 68 5C CD 06 34 EB CD C0 33 EB E1 C9
06 05 1A 4E EB 12 71 23 13 10 F7 EB C9
47 CD 5E 33
31 0F C0
* *podpgm pro preneseni konstanty na zasobnik (#A0..#A4) * ld H,D _HL se nastavi na ld L,E adresu vysledku exx push HL uschovan ukazatel na dalsi op.kod ld HL,#32C5 bazova adresa tabulky konstant exx call #33F7 nalezeni potrebne konstanty call #33C8 a jeji kopie na zasobnik exx pop HL ukazatel na dalsi op.kod v _HL' exx ret * *podpgm pro zkopirovani hodnoty ze zasobniku do pameti *kalkulatoru mem0..mem5 (#C0..#C5) * push HL ukazatel na posledni hodnotu ex DE,HL uschovan a predan do _DE ld HL,(MEM) bazova adresa oblasti mem call #3406 vypocet cilove adresy ex DE,HL pro prenos musi byt zameneny call DOUBLE cilova adresa se zdrojovou ex DE,HL >STKEND< (=posl.hodn.+5) do _DE pop HL obnoven ukazatel na posl.hodnotu ret * *podpgm pro zamenu (prehozeni) poslednich dvou hodnot *na zasobniku (#01;swap) * SWAP ld B,5 _B jako pocitadlo ld A,(DE) 1.bajt druheho ld C,(HL) 1.bajt prvniho cisla ex DE,HL zamena ukazatelu ld (DE),A oba bajty zapsany ld (HL),C na puvodni pozici toho druheho inc HL oba ukazatele posunuty inc DE na dalsi bajt djnz #343E probehne pro 5 dvojic ex DE,HL korekce ukazatelu ret * *podpgm pro generovani polynomu pro fce jako 'SIN','ATN' ap. *(op.kody #86,#88,#8cC - v tabulce #3E) * ld B,A parametr do _B call #335E a do >BREG< jako pocitadlo * *priprava posledni hodnoty "Z" * DEFB #31 Z Z ;dup DEFB #0F 2*Z ;add DEFB #C0 2*Z->mem0
3450 3451 3452 3453 3453 3453 3453 3453 3453 3454 3455 3456 3457 3458 3459 345A 345A 345A 345A 345D 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 346A 346A 346A 346A 346C 346E 346E 346E 346E 3471 3472 3474 3475 3476 3478 3479 347A 347C 347D 347E 347F 3480 3481 3482 3483 3483 3483 3483 3484 3485
02 A0 C2
0 0
31 E0 04 E2 C1 03 38
CD C6 33 CD 62 33 0F 01 C2 02 35 EE E1 03 38 C9
06 FF 18 06
CD D8 06 7E A7 28 23 78 E6 B6 17 3F 1F 77 2B C9
E9 34 00 0B 80
D5 E5 CD 7F 2D
* *v nasledujici smycce jsou spocitany koeficienty: *B(m)=2*Z*B(m-1)-B(m-2)+C(m),pricemz m=0..n *konstanty C(m) stoji za volanim teto rutiny * POLYS DEFB #31 B(m) B(m) ;dup DEFB #E0 B(m) B(m) 2*Z ;mem0->stack DEFB #04 B(m) B(m)*2*Z ;multi DEFB #E2 B(m) 2*Z*B(m) B(m-1) ;mem2->stack DEFB #C1 ;B(m-1)->mem1 DEFB #03 B(m) 2*Z*B(m)-B(m-1) ;sub DEFB #38 * *dalsi konstanta na zasobnik * call #33C6 B(m) 2*Z*B(m)-B(m-1) C(m-1) call CALC2 znovu volan kalk.,beze zmeny >BREG< DEFB #0F B(m) 2*Z*B(m)-B(m-1)+C(m+1) DEFB #01 2*Z*B(m)-B(m-1)+C(m+1) B(m) DEFB #C2 ;B(m)->mem2 DEFB #02 B(m+1)=2*Z*B(m)-B(m-1)+C(m+1) DEFB #35 B(m+1) ;pocitadlo v >BREG< -1 DEFB #EE pokud neni =0:skok na POLYS DEFB #E1 B(m) B(m-1) ;mem2->stack DEFB #03 B(m)-B(m-1) = koeficient DEFB #38 ret * *funkce 'ABS' (op.kod #2A) * ABSOLU ld B,#FF iniciace _B jr #3474 a skok do rutiny NEGIER * *podpgm pro zmenu znamenka posl.hodnoty na zasobniku (#1B) * NEGIER call #34E9 kdyz je cislo nula ret C pak se nebude nic provadet ld B,0 _B=0 pro negaci ld A,(HL) prevzeti 1.bajtu and A pokud je nulovy jr Z,#3483 jde o cislo "integer" inc HL jinak ukazatel na 2.bajt ld A,B bit7=1 pro 'ABS',bit7=0 pro negaci and #80 ponecha jen tento bit or (HL) (pro 'ABS' nastaven) rla pres CARRY je invertovan ccf rra ld (HL),A bajt se zmenenym znamenkem zpet dec HL ukazatel opet na 1.bajt ret * *zmena znamenka cisla "integer" * push DE uschovan >STKEND< push HL a ukazatel na cislo call #2D7F znamenko do _C,cislo do _DE
3488 3489 348A 348B 348C 348D 3490 3491 3492 3492 3492 3492 3492 3492 3495 3496 3497 349A 349B 349D 349E 349F 34A0 34A3 34A4 34A5 34A5 34A5 34A5 34A8 34AA 34AC 34AC 34AC 34AC 34AF 34B0 34B3 34B3 34B3 34B3 34B3 34B3 34B6 34B9 34BA 34BB 34BC 34BC 34BC 34BC 34BF 34C0 34C1 34C2 34C4 34C5 34C8 34CA 34CC
E1 78 B1 2F 4F CD 8E 2D D1 C9
obnoven ukazatel na cislo #FF pro 'ABS',#00 pro negaci zde znamenko pro 'ABS' vzdy #FF znamenko invertovano a kopie do _C cislo "integer" zapsano zpet obnoveni >STKEND< v _DE
CD D8 D5 11 23 CB 2B 9F 4F CD D1 C9
E9 34 01 00 16
8E 2D
CD 99 1E ED 78 18 04
CD 99 1E 0A C3 28 2D
CD 99 1E 21 2B 2D E5 C5 C9
CD 0B 78 B1 20 1A CD 38 D6
F1 2B
23 8D 2C 09 90
* *podpgm pro vyhodnoceni znamenka *vysledek na zasobnik:zaporne=-1,kladne=+1,nula=0 *jde o fci 'SIGN' (op.kod #29) * call #34E9 kdyz jde o nulu ret C hned navrat push DE jinak uschova >STKEND< ld DE,1 inc HL _HL adresuje 2.bajt rl (HL) znamenkovy bit do CARRY dec HL ukazatel zpet na 1.bajt sbc A pro kladne znamenko 0,pro zaporne #FF ld C,A call #2D8E ulozi na zasobnik +/-1 pop DE obnoveni >STKEND< ret * *prikaz 'IN' (cteni portu,op.kod #2C) * call INTEG2 adresa portu do _BC in A,(C) precteni hodnoty jr #34B0 a jeji ulozeni na zasobnik * *prikaz 'PEEK' (op.kod #2B) * call INTEG2 adresa do _BC ld A,(BC) prevzeti bajtu z teto adresy jp #2D28 a ulozeni na zasobnik * *prikaz 'USR' s cislem (op.kod #2D) *strojovy pgm smi vyuzivat vsech registru krome _HL' *je-li _HL' pouzito,musi byt pred navratem rovno #2758 * call INTEG2 vlozi do _BC startovni adresu ld HL,#2D2B navratova adresa uschovana push HL na systemovy zasobnik push BC taktez startovni adresa ret pro neprimy skok na zacatek mc-pgmu * *prikaz 'USR' se znakem "UDG" (usr$,op.kod #19) * call #2BF1 doda parametry retezce dec BC delka musi byt =1 ld A,B or C jr NZ,#34E7 je-li delka <>1:chyba ld A,(DE) nazev retezce prevzat call #2C8D a testovan na pismeno jr C,#34D3 pismeno:skok sub #90 pro zjisteni "UDG" odectenim hodnota v mezich 0..20
34CC 34CE 34D0 34D2 34D3 34D3 34D4 34D5 34D6 34D7 34D9 34D9 34DB 34DF 34E0 34E1 34E3 34E4 34E7 34E7 34E8 34E9 34E9 34E9 34E9 34EA 34EB 34EC 34ED 34EE 34EF 34F0 34F1 34F2 34F3 34F4 34F5 34F6 34F7 34F8 34F9 34F9 34F9 34F9 34F9 34FC 34FD 34FF 3501 3501 3501 3501 3501 3501 3504 3506 3506 3506 3506 3507
38 19 FE 15 30 15 3C * 3D 87 87 87 FE A8 30 ED 81 4F 30 04 C3 CF 09 0C 4B 7B 5C 01 2B 2D *
je mensi:chyba je-li vetsi take chyba (kvuli nasledujicimu dec A) tyto operace slouzi k vypoctu ofsetu povoluji pouze UDG 0..20 a pismena 'A'..'U' hodnota ASCII je redukovana do rozsahu 0..20 pismeno za 'U':chyba adresa 1.bajtu definovane grafiky pricten ofset a vysledek do _BC pokud pricteno bez CARRY jinak _B+1 adresa ulozena na calcstack chybove hlaseni 'Invalid argument'
E5 C5 47 7E 23 B6 23 B6 23 B6 78 C1 E1 C0 37 C9
CD E9 34 D8 3E FF 18 06
CD E9 34 18 05
AF 23
* *podpgm pro test,zda cislo na zasobniku je 0 * push HL uschovan ukazatel na cislo push BC ld B,A _A uschovano do _B ld A,(HL) prvni bajt prevzat inc HL a provedeno log.OR s dalsimi tremi or (HL) (vsechny musi byt nulove) inc HL (a CARRY bude take 0) or (HL) inc HL or (HL) ld A,B obnoveni _A, pop BC _BC pop HL i ukazatele na cislo ret NZ cislo<>0:CARRY=0 scf cislo =0:CARRY=1 ret * *podpgm pro test ">0" (op.kod #37) *pokud pravda,doda na zasobnik 1, jinak 0 * call #34E9 test na nulu ret C ano:navrat ld A,#FF bude vyhodnocovat "<0",proto jr #3507 _A signalizuje opacny test * *funkce 'NOT' (op.kod #30) *posledni hodnota bude 1,kdyz puvodni byla 0, *jinak ulozi vzdy 0 * call #34E9 test na nulu jr #350B a skok k ulozeni vysledku * *funkce "<0" (op.kod #36) * xor A nulovani _A inc HL ukazuje na znamenko
3508 3509 350A 350B 350B 350B 350B 350C 350E 350F 3510 3511 3512 3513 3514 3514 3515 3516 3517 3518 3519 351A 351B 351B 351B 351B 351B 351B 351C 351F 3520 3521 3522 3524 3524 3524 3524 3524 3524 3525 3528 3529 352A 352B 352D 352D 352D 352D 352D 352D 352E 3531 3532 3533 3534 3535 3536 3537 3538 3539
AE 2B 07
xor (HL) dec HL rlca * *podpgm pro * push ld ld inc ld inc rla ld rra inc ld inc ld pop ret
ulozeni 0 (pri CARRY=0) nebo 1 na zasobnik HL A,0 (HL),A HL (HL),A HL (HL),A HL (HL),A HL (HL),A HL uschova ukazatele na vysledek nejprve oba bajty vynulovany
E5 3E 00 77 23 77 23 17 77 1F 23 77 23 77 E1 C9
CARRY presunuto do _A takze 3.bajt bude roven 1,kdyz bylo CARRY nastaveno _A=0 ctvrty a paty bajt nulovany obnoven ukazatel na vysledek
EB CD E9 34 EB D8 37 18 E7
EB CD E9 34 EB D0 A7 18 DE
EB CD E9 34 EB D0 D5 1B AF 12 1B 12 D1
* *funkce 'OR' (op.kod #07) *vysledek teto operace ("x OR y") je x,pokud je y=0, *v ostatnich pripadech 1 * ex DE,HL _HL ukazuje na y (2.cislo) call #34E9 test,zda y=0 ex DE,HL ukazatele v puvodnich registrech ret C y=0:navrat scf jinak nastaveno CARRY jr #350B a na zasobnik prijde jednicka * *funkce 'AND' (op.kod #08) *operace "x AND y" vyda vysledek x,pokud y<>0 *v ostatnich pripadech hodnotu 0 * ex DE,HL _HL ukazuje na y (2.cislo) call #34E9 y testovano na nulu ex DE,HL zpetna zamena ret NC y<>0:navrat and A smazano CARRY jr #350B a na zasobnik vysledek 0 * *funkce "retezec AND cislo" (op.kod #10) *vysledek operace "a$ AND x" je a$,pokud x<>0, *v opacnem pripade je to prazdny retezec * ex DE,HL _HL ukazuje na x call #34E9 x testovano na nulu ex DE,HL zpetna zamena ret NC x<>0:navrat push DE jinak uschovan ukazatel na x dec DE MSB adresy delky xor A _A=0 ld (DE),A oba bajty s hodnotou delky dec DE retezce nulovany ld (DE),A pop DE obnoveni ukazatele na cislo
353A 353B 353B 353B 353B 353B 353C 353E 3540 3542 3543 3544 3544 3544 3546 3547 3548 354B 354C 354D 354E 3550 3552 3553 3554 3557 3559 3559 3559 3559 355A 355B 355E 355F 3560 3563 3564 3565 3566 3567 3568 356A 356B 356C 356E 356F 3570 3572 3572 3573 3575 3575 3576 3578 3579 357A 357C 357E 357F 3580
C9
78 D6 08 CB 57 20 01 3D 0F 30 F5 E5 CD D1 EB F1 CB 20 0F F5 CD 18 08 3C 34
57 07 0F 30 33
0F F5 CD D5 C5 CD E1 7C B5 E3 78 20 B1 C1 28 F1 3F 18
F1 2B F1 2B
0B 04 16
F1 18 13 B1 28 0D 1A 96 38 09 20 ED 0B 13 23
ret * *operace pro porovnani (op.kody #09..#0E,#11..#16) *operacni kod je pri vstupu v _B * ld A,B operacni kod sub 8 do rozmezi #01..#06 a #09..#0E bit 2,A toto rozmezi pozmeni tak jr NZ,#3543 ze #00.#02,#04..#06,#08..#0A dec A #0C..#0E zustavaji rrca redukuje na #00.#07 a ovlivni CARRY jez slouzi k rozliseni doplnkovych operaci jr NC,#354E push AF pro doplnkove operace budou oba push HL argumenty vymeneny call SWAP pop DE ex DE,HL pop AF bit 2,A retezcova operace ? jr NZ,#3559 ano rrca pro '=' a '<>' je CARRY nastaveno push AF a uschovano call SUBTRA pro dalsi test provedeno odecteni jr #358C * *retezcove operace * rrca pro '=' a '<>' nastaveno CARRY push AF a uschovano call #2BF1 prevzeti parametru 2.retezce push DE ze zasobniku a push BC jejich uschova call #2BF1 prevzeti parametru 1.retezce pop HL v _HL obnovena delka 2.retezce ld A,H a testovana na nulu or L ex (SP),HL adresa a delka vymeneny ld A,B MSB delky 1.retezce do _A jr NZ,#3575 pokud delka 2.retezce <>0:skok or C delka 1.retezce je 0 ? pop BC delka druheho do _BC jr Z,#3572 obe delky =0:skok pop AF 2.retezec je 0 nebo mensi ccf nez prvni:invertovano CARRY jr #3588 * pop AF jr #3588 * or C 1.retezec=0 (2.ne) ? jr Z,#3585 ano ld A,(DE) oba retezce <>0:porovnavany sub (HL) dalsi bajty jr C,#3585 bajt z 1. je mensi:skok jr NZ,#356B bajt z 2. je mensi:skok dec BC jsou shodne,delka -1 inc DE a oba ukazatele inc HL posunuty
3581 3582 3583 3585 3585 3586 3587 3588 3588 3589 358A 358B 358C 358C 358D 358E 3591 3592 3593 3596 3597 3598 359B 359C 359C 359C 359C 359F 35A0 35A1 35A4 35A5 35A6 35A7 35A8 35A9 35AA 35AB 35AC 35AF 35B0 35B1 35B2 35B3 35B5 35B7 35B8 35B9 35BA 35BB 35BD 35BF 35BF 35BF 35BF 35BF 35C2 35C5 35C6 35C7
E3 2B 18 DF * C1 F1 A7 * F5 EF A0 38 * F1 F5 DC 01 35 F1 F5 D4 F9 34 F1 0F D4 01 35 C9
ex (SP),HL dec HL jr #3564 pop BC pop AF and A push rst DEFB DEFB pop push call pop push call pop rrca call ret AF CALSW #A0 #38 AF AF C,#3501 AF AF NC,#34F9 AF NC,#3501
delka 2.retezce do _HL a odectena 1 dalsi porovnavani 1.retezec je mensi nez druhy smazani CARRY pro test uschova pro test retezcu bude na zasobnik ulozena 0 pro '=' nebo '<>' je cARRY nastaveno potom staci zavolat 'NOT' pro vsechny ostatni pripady je volano '>0' pro '>','<' a '=' je jeste jednou volano 'NOT'
CD D5 C5 CD E1 E5 D5 C5 09 44 4D F7 CD C1 E1 78 B1 28 ED C1 E1 78 B1 28 ED
F1 2B F1 2B
B2 2A
02 B0
02 B0
2A 65 5C 11 FB FF E5 19 D1
* *podpgm pro scitani retezcu (op.kod #17) * call #2BF1 prevzaty parametry 2.retezce push DE a uschovany push BC call #2BF1 prevzaty parametry 1.retezce pop HL delka 2.retezce obnovena v _HL push HL push DE uschova parametru 1.retezce push BC add HL,BC obe delky secteny ld B,H a vysledek okopirovan do _BC ld C,L rst REST30 timto vyhrazen potrebny prostor call #2AB2 parametry noveho retezce na zasobnik pop BC prevzaty paramery 1.retezce pop HL pro jeho zkopirovani ld A,B test,zda jeho delka or C je nulova jr Z,#35B7 ano:nic se kopirovat nebude ldir jinak retezec prenesen pop BC parametry druheho retezce pop HL prevzaty pro jeho zkopirovani ld A,B opet test or C na nulovou delku jr Z,#35BF ano:zadne prenaseni ldir jinak 2.retezec pripojen za 1. * *podpgm pro vlozeni >STKEND< do _DE *>STKEND< -5 (tj. 1.bajt posledni hodnoty) do _HL * ld HL,(STKEND) prevzeti hodnoty ze >STKEND< ld DE,#FFFB = -5 push HL >STKEND< uschovan add HL,DE v _HL spocitano >STKEND< -5 pop DE >STKEND< obnoven v _DE
35C8 35C9 35C9 35C9 35C9 35CC 35CE 35D0 35D1 35D4 35D5 35D6 35D7 35DA 35DB 35DC 35DC 35DD 35DE 35DE 35DE 35DE 35E1 35E2 35E3 35E5 35E6 35E7 35EA 35EB 35EC 35ED 35EE 35F2 35F3 35F5 35F6 35F7 35F9 35FD 3600 3601 3603 3605 3606 3607 360A 360C 360F 3612 3616 3619 361A 361D 361F 361F 361F 361F 3622 3623
C9
ret * *funkce 'CHR$' (op.kod #2F) * CD D5 2D call #2DD5 posledni hodnota do _A 38 0E jr C,#35DC pokud je cislo >255 20 0C jr NZ,#35DC nebo zaporne:chyba F5 push AF hodnota uschovana 01 01 00 ld BC,1 jedno pametove misto F7 rst REST30 v pracovnim prostoru vyhrazeno F1 pop AF obnoveni hodnoty 12 ld (DE),A a jeji zapsani CD B2 2A call #2AB2 parametry noveho retezce na zasobnik EB ex DE,HL zpetna zamena ukazatelu C9 ret * CF rst ERROUT chybove hlaseni 0A DEFB #0A 'Integer out of range' * *funkce 'VAL' (op.kod #1D) a 'VAL$' (#18) * 2A 5D 5C ld HL,(CHADD) E5 push HL uschova >CHADD< 78 ld A,B op.kod do _A C6 E3 add #E3 9F sbc A pro 'VAL' #FF, pro 'VAL$' #00 F5 push AF tato znacka uschovana CD F1 2B call #2BF1 prevezme parametry retezce D5 push DE uschova pocatecni adresy 03 inc BC delka +1 F7 rst REST30 vyhradi potrebny prostor E1 pop HL obnoveni pocatecni adresy ED 53 5D 5C ld (CHADD),DE ukazatel na 1.nove misto D5 push DE zapsan do >CHADD< a uschovan ED B0 ldir retezec prekopirovan EB ex DE,HL 2B dec HL na posledni pozici noveho retezce 36 0D ld (HL),#0D je zapsano 'ENTER' FD CB 01 BE res 7,(FLAGS) pozn:kontrola syntaxe CD FB 24 call SCANN prozkousena spravnost syntaxe retezce DF rst GETACT znak za retezcem prevzat FE 0D cp #0D a testovan 20 07 jr NZ,#360C nejde o 'ENTER':chyba E1 pop HL pocatecni adresa retezce F1 pop AF znacka v _A obnovena FD AE 01 xor (FLAGS) a porovnana s bitem6 >FLAGS< E6 40 and #40 (ktery je ovlivnen ko.syntaxe) C2 8A 1C jp NZ,#1C8A pokud nerovny:chyba 22 5D 5C ld (CHADD),HL pocatecni adresa do >CHADD< FD CB 01 FE set 7,(FLAGS) pozn:beh pgmu CD FB 24 call SCANN retezec zpracovan jako dalsi vyraz E1 pop HL obnovena puvodni hodnota >CHADD< 22 5D 5C ld (CHADD),HL a zapsana 18 A0 jr #35BF * *funkce 'STR$' (op.kod #2E) * 01 01 00 ld BC,1 jeden bajt F7 rst REST30 v pracovnim prostoru vyhrazen 22 5B 5C ld (KCUR),HL adresa do >KCUR<
3626 3627 362A 362B 362D 3630 3633 3634 3637 3638 363B 363C 363E 363F 3640 3643 3644 3645 3645 3645 3645 3648 364A 364D 3650 3651 3654 3657 365A 365C 365D 365E 365F 3662 3663 3666 3669 3669 3669 3669 366C 366D 366E 3670 3671 3674 3674 3674 3674 3677 367A 367A 367A 367A 367A 367A 367B 367C 367F 3680
E5 2A E5 3E CD CD E1 CD D1 2A A7 ED 44 4D CD EB C9
51 5C FF 01 16 E3 2D 15 16 5B 5C 52 B2 2A
push ld push ld call call pop call pop ld and sbc ld ld call ex ret
HL HL,(CURCHL) HL A,#FF OPCAN #2DE3 HL #1615 DE HL,(KCUR) A HL,DE B,H C,L #2AB2 DE,HL
a uschovana adresa aktualniho kanalu uschovana kanal -R- pro pracovni prostor otevren hodnota z calcstacku do prac.prostoru aktualni adresa kanalu a >FLAGS< vraceny pocatecni adresa retezce adresa kurzoru (v prac.prostoru) (smazani CARRY) jejich rozdil dava delku retezce tato predana do _BC parametry retezce na calcstack korekce ukazatelu
CD FE D2 2A E5 CD CD 01 30 0C F7 12 CD E1 CD C3
94 1E 10 9F 1E 51 5C 01 16 E6 15 00 00 03
B2 2A 15 16 BF 35
CD F1 2B 78 B1 28 01 1A C3 28 2D
CD F1 2B C3 2B 2D
D9 E5 21 67 5C 35 E1
* *podpgm pro 'READ IN' (op.kod #1A) * call INTEG1 numericky parametr do _A cp 16 musi byt mensi nez 16 jp NC,#1E9F neni:chyba ld HL,(CURCHL) aktualni kanalova adresa push HL uschovana call OPCAN otevren parametrem specif.kanal call #15E6 prevzat znak ld BC,0 implicitne delka=0 jr NC,#365F zadny znak:skok inc C jinak delka +1 rst REST30 vyhrazen jeden bajt ld (DE),A a znak je do nej zapsan call #2AB2 parametry retezce na calcstack pop HL obnovena aktualni adresa kanalu call #1615 a zapsana zpet jp #35BF nastaveny ukazatele _HL a _DE * *funkce 'CODE' (op.kod #1C) * call #2BF1 prevzeti parametru retezce ld A,B jeho delka testovana na nulu or C jr Z,#3671 nulova:skok ld A,(DE) jinak precten znak (ASCII kod) jp #2D28 a ulozen na calcstack * *funkce 'LEN' (op.kod #1E) * call #2BF1 prevzeti parametru retezce jp #2D2B a delka (_BC) ulozena na calcstack * *podpgm pro snizeni >BREG< o 1 *>BREG< slouzi jako pocitadlo pro smycku (obdoba "djnz") *(op.kod #35) * exx druha sada registru push HL uschova ukazatele na dalsi op.kod ld HL,BREG vlozena adresa >BREG< dec (HL) hodnota na ni -1 pop HL obnoven ukazatel
3681 3683 3684 3685 3686 3686 3686 3686 3687 3688 3689 368A 368B 368C 368D 368E 368F 368F 3690 3691 3692 3693 3694 3695 3697 3698 3699 369A 369B 369B 369B 369B 369C 369D 369E 369F 36A0 36A0 36A0 36A0 36A0 36A0 36A1 36A2 36A3 36A4 36A5 36A6 36A7 36A8 36A9 36AA 36AB 36AC 36AD 36AE 36AF 36AF 36AF 36AF
20 04 23 D9 C9
D9 5E 7B 17 9F 57 19 D9 C9 13 13 1A 1B 1B A7 20 EF D9 23 D9 C9
F1 D9 E3 D9 C9
EF C0 02 31 E0 05 27 E0 01 C0 04 03 E0 38 C9
EF
* *podpgm 'JUMP' pro preskoceni kodu kalkulatoru (op.kod #33) * exx druha sada registru ld E,(HL) prectena velikost skoku ld A,E rla pro kladny ofset #00, sbc A pro zaporny #FF ld D,A tato hodnota do _D' add HL,DE souctem cilova adresa skoku exx normalni sada ret * inc DE adresuje treti bajt inc DE ld A,(DE) a prevezme jej do _A dec DE ukazatel zpet na prvni bajt dec DE and A hodnota =0 ? jr NZ,#3686 ne:provede se preskok exx jinak je jen inc HL prekrocen ofset a _HL' ukazuje exx na dalsi op.kod ret * *podpgm pro navrat z kalkulatoru (op.kod #38) * pop AF odstranena navratova adresa #3365 exx ex (SP),HL _HL' (normalne na dalsi op.kod) exx na systemovy zasobnik ret pro neprimy skok,pokr.mc-pgm * *podpgm pro vypocet 'N mod M' (op.kod #32) *celociselny podil INT(N/M) je posledni hodnota na calcstacku *zbytek deleni je pod nim (predposledni) * rst CALSW N M DEFB #C0 N M ;m->mem0 DEFB #02 N ;drop DEFB #31 N N ;dup DEFB #E0 N N M ;mem0->stack DEFB #05 N N/M ;divide DEFB #27 N int(N/M) ;int DEFB #E0 N int(N/M) M ;mem0->stack DEFB #01 N M int(N/M) ;swap DEFB #C0 N M int(N/M) ;stack->mem0 DEFB #04 N M*int(N/M) ;multi DEFB #03 N-M*int(N/M)=zbytek ;sub DEFB #E0 zbytek INT(N/M) ;mem0->stack DEFB #38 ret * *funkce 'INTEGER' (op.kod #27) * rst CALSW X
36B0 36B1 36B2 36B4 36B5 36B6 36B7 36B8 36B9 36BA 36BB 36BC 36BD 36BE 36BF 36C0 36C1 36C2 36C3 36C4 36C4 36C4 36C4 36C5 36C6 36C7 36CC 36CD 36CE 36CF 36D0 36D1 36D2 36D3 36D4 36D5 36D6 36D8 36DB 36DF 36E3 36E8 36ED 36F2 36F7 36F8 36F9 36FC 36FE 3700 3701 3703 3703 3704 3705 3705 3707 3708 370A 370A
31 36 00 04 3A 38 C9 31 3A C0 03 E0 01 30 00 03 A1 03 38 C9
EF 3D 34 F1 04 31 27 C3 03 31 0F A1 03 88 13 58 9D A2 E7 EB EE F1 E3 38 CD 20 38 86 30 CF 05
38 AA 3B
36 65 78 60 21 2F 7E 3A
66 65 32 F7 B0 BB 7E
40 C9 AF B0 94 F8
D5 2D 07 03 09
38 07 96 30 04 ED 44
DEFB #31 X X ;dup DEFB #36 X X<0 ;<0? DEFB #00 #04 X ;jrt INTINV DEFB #3A int(X) DEFB #38 ret INTINV DEFB #31 X X ;dup DEFB #3A X int(X) ;int DEFB #C0 X int(X) ;int(X)->mem0 DEFB #03 X-int(X) ;sub DEFB #E0 X-int(X) int(X) ;mem0->stack DEFB #01 int(X) X-int(X) ;swap DEFB #30 int(X) (1 neb 0) ;not DEFB #00 int(X) ;jrt DEFB #03 zbytek byl =0:skok na NEGINT DEFB #A1 int(X) 1 DEFB #03 int(X)-1 ;sub NEGINT DEFB #38 ret * *funkce 'E^X' (op.kod #26) * rst CALSW X DEFB #3D X ;int->fp DEFB #34 X 1/ln2 ;number DEFB #F1 #38 #AA #3B #29 DEFB #04 X/ln2=Z ;multi DEFB #31 Z Z ;dup DEFB #27 Z int(Z)=N ;int DEFB #C3 Z N ;N->mem3 DEFB #03 Z-N=Y ;sub DEFB #31 Y Y ;dup DEFB #0F 2*Y ;add DEFB #A1 2*Y 1 ;konst DEFB #03 2*Y-1 ;sub DEFB #88 ;generuje polynom DEFB #13 #36 DEFB #58 #65 #66 DEFB #9D #78 #65 #40 DEFB #A2 #60 #32 #C9 DEFB #E7 #21 #F7 #AF #24 DEFB #EB #2F #B0 #B0 #14 DEFB #EE #7E #BB #94 #58 DEFB #F1 #3A #7E #F8 #CF DEFB #E3 2^W N ;mem3->stack DEFB #38 call #2DD5 N do _A jr NZ,#3705 je-li N zaporne:skok jr C,#3703 je-li N>255:chyba add (HL) pricten exponent jr NC,#370C bez preteceni * rst ERROUT chybove hlaseni DEFB #05 'Number too big' * jr C,#370E je-li N mensi nez -255,je vysledkem 0 sub (HL) odecteni exponentu jr NC,#370E je-li exponent >0,je vysledkem 0 (podteceni) neg korekce exponentu
370C 370D 370E 370E 370F 3710 3711 3712 3713 3713 3713 3713 3713 3713 3714 3715 3716 3717 3719 371A 371A 371B 371C 371C 371D 371E 371F 3720 3722 3725 3726 3727 3729 372A 372B 372C 372D 3732 3733 3734 3736 3737 3738 3739 373A 373B 373C 373D 373E 373E 373E 373E 373E 373F 3744 3745 3746 3747 3748 3749
77 C9 * EF 02 A0 38 C9
ld (HL),A ret rst DEFB DEFB DEFB ret CALSW #02 #A0 #38
;drop ;konst
EF 3D 31 37 00 04 38 CF 09 A0 02 38 7E 36 CD EF 34 38 03 01 31 34 F0 03 37 00 01 A1 03 01 38 34 EF 01
80 28 00
4C 08
34 F0 31 04 01 A2 03 A2 03
* *funkce 'LN (X)' (po.kod #25) *pro vypocet jsou dva zpusoby,z nichz je pouzit jeden *pro X<.8 a druhy pro X>.8 * rst CALSW X DEFB #3D X int->fp DEFB #31 X X ;dup DEFB #37 X X>0 ;>0? DEFB #00 #04 X ;jrt LNPOS DEFB #38 jinak * rst ERROUT chybove hlaseni DEFB #09 'Invalid argument' * LNPOS DEFB #A0 X 0 ;konst DEFB #02 X ;drop DEFB #38 ld A,(HL) prevzeti exponentu ld (HL),#80 zmeni X na X' 2D call #2D28 X' E ;ulozi exponent rst CALSW X' E DEFB #34 X' E 128 ;number DEFB #38 #00 DEFB #03 X' E-128=E' ;sub DEFB #01 E' X' ;swap DEFB #31 E' X' X' ;dup DEFB #34 E' X' X' .8 ;number CC CC DEFB #F0 #4C #CC #CC #CD DEFB #03 E' X' X'-.8 DEFB #37 E' X' X'-.8>0 ;>0? DEFB #00 #08 E' X' ;jrt GREAT8 DEFB #01 X' E' ;swap DEFB #A1 X' E' 1 ;konst DEFB #03 X' E'-1 ;sub DEFB #01 E'-1 X' ;swap DEFB #38 inc (HL) E'-1 2*X' rst CALSW E'-1 2*X' GREAT8 DEFB #01 X'' E'' ;swap dale: X''=2*X' pokud bylo X'<.8 jinak X''=X' a E''=E'-1,pokud bylo X'<.8 nebo E''=E',pokud bylo X'>.8 DEFB #34 X'' E'' ln2 ;konst 72 17 DEFB #F0 #31 #72 #17 #F8 DEFB #04 X'' E''*ln2 ;multi DEFB #01 E''*ln2=Y X'' ;swap DEFB #A2 Y X'' .5 ;konst DEFB #03 Y X''-.5 ;sub DEFB #A2 Y X''-.5 .5 ;konst DEFB #03 Y X''-1 ;sub
374A 374B 374C 374E 374F 3750 3751 3752 3754 3756 3759 375C 375F 3763 3767 376B 3770 3775 377A 377F 3780 3781 3782 3783 3783 3783 3783 3784 3785 3786 378B 378C 378D 378E 378F 3790 3791 3792 3793 3794 3795 3796 3797 3798 3799 379A 379B 379C 379E 379F 37A0 37A1 37A1 37A2 37A3 37A4 37A5 37A7 37A8 37A9
31 34 32 04 A2 03 8C 11 14 56 59 5C 9E A1 A4 E7 EA ED F0 04 0F 38 C9
20
AC 09 DA 30 90 70 CB 31 A0 1B A7 6E
A5 C5 AA 6F DA 9F FE 43 9C 23
61 96 B4 5C CA 7E 80
DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB ret
#31 #34 #32 #04 #A2 #03 #8C #11 #14 #56 #59 #5C #9E #A1 #A4 #E7 #EA #ED #F0 #04 #0F #38
;dup ;number
Y X''-1 2.5*X''-2.5 ;multi Y X''-1 2.5*X''-2.5 .5;konst Y X''-1 2.5*X''-3 ;sub polynomicky rozvoj #AC #09 #DA #30 #90 #70 #CB #31 #A0 #1B #A7 #6E #A5 #C5 #AA #6F #DA #9F #FE #43 #9C #23
#61 #96 #B4 #5C #FC #CA #36 #7E #5E #80 #93 ln(2^E'')=Y lnX'' ln((2^E'')*X'')=lnX
* *podpgm pro * EF rst 3D DEFB 34 DEFB EE 22 F9 83 DEFB 04 DEFB 31 DEFB A2 DEFB 0F DEFB 27 DEFB 03 DEFB 31 DEFB 0F DEFB 31 DEFB 0F DEFB 31 DEFB 2A DEFB A1 DEFB 03 DEFB 31 DEFB 37 DEFB C0 DEFB 00 04 DEFB 02 DEFB 38 DEFB C9 ret * A1 ZPOS1 DEFB 03 DEFB 01 DEFB 36 DEFB 00 02 DEFB 1B DEFB 38 YNEGAT DEFB C9 ret
redukci argumentu pro 'SIN' a 'COS' na -.5<=V<.5 CALSW X #3D X ;int->fp #34 X 1/(2*PI) ;number #EE #22 #F9 #83 #6E #04 X/(2*PI) ;multi #31 X/(2*PI) X/(2*PI) ;dup #A2 X/(2*PI) X/(2*PI) .5 ;konst #0F X/2/PI X/2/PI+.5 ;add #27 X/2/PI int(X/2/PI+.5);int #03 X/2/PI-int(X/2/PI+.5)=Y;sub #31 Y Y ;dup #0F 2*Y ;add #31 2*Y 2*Y ;dup #0F 4*Y ;add #31 4*Y 4*Y ;dup #2A 4*Y abs(4*Y) ;abs #A1 4*Y abs(4*Y) 1 ;konst #03 4*Y abs(4*Y)-1=Z ;sub #31 4*Y Z Z ;dup #37 4*Y Z Z>0 ;>0? #C0 4*Y Z Z>0 ;0 neb 1->mem0 #00 #04 4*Y Z ;jrt ZPOS1 #02 4*Y ;drop #38 #A1 #03 #01 #36 #00 #02 #1B #38 4*Y 4*Y Z-1 Z-1 Z-1 1-Z Z 1 Z-1 4*Y 4*Y<0 ;konst ;sub ;swap ;<0? ;jrt YNEGAT ;neg
37AA 37AA 37AA 37AA 37AB 37AC 37AD 37AE 37AF 37B0 37B2 37B3 37B5 37B5 37B5 37B5 37B6 37B7 37B8 37B9 37BA 37BB 37BC 37BD 37BE 37BE 37BF 37C1 37C4 37C8 37CD 37D2 37D7 37D7 37D8 37D9 37DA 37DA 37DA 37DA 37DB 37DC 37DD 37DE 37DF 37E0 37E1 37E2 37E2 37E2 37E2 37E2 37E2 37E2 37E2 37E2 37E5 37E6 37E8 37EA
EF 39 2A A1 03 E0 00 06 1B 33 03
EF 39 31 31 04 31 0F A1 03 86 14 5C A3 E9 EE F1 04 38 C9 E6 1F 8F 15 92 23
0B 38 63 0D 5D
EE BB CD 1B
EF 31 1F 01 20 05 38 C9
CD 97 32 7E FE 81 38 0E EF
* *funkce 'COSINUS' (op.kod #20) * rst CALSW X DEFB #39 V ;red.arg DEFB #2A abs(V) ;abs DEFB #A1 abs(V) 1 ;konst DEFB #03 abs(V)-1 ;sub DEFB #E0 abs(V)-1 Z>0 (:#379A);mem0->stack DEFB #00 #06 abs(V)-1 ;jrt SINCOS DEFB #1B 1-abs(V) ;neg DEFB #33 #03 1-abs(V)=W ;jr SINCOS * *podpgm pro vypocet 'SINUS' (op.kod #1F) * rst CALSW X DEFB #39 W ;red.arg SINCOS DEFB #31 W W ;dup DEFB #31 W W W ;dup DEFB #04 W W*W ;multi DEFB #31 W W*W W*W ;dup DEFB #0F W 2*W*W ;add DEFB #A1 W 2*W*W 1 ;konst DEFB #03 W 2*W*W-1 ;sub * DEFB #86 polynomicky rozvoj DEFB #14 #E6 DEFB #5C #1F #0B DEFB #A3 #8F #38 #EE DEFB #E9 #15 #63 #BB #23 DEFB #EE #92 #0D #CD #ED DEFB #F1 #23 #5D #1B #EA W sin(PI*W/2)/W DEFB #04 sin(PI*W/2)=sin(X) nebo cos(X) DEFB #38 ret * *podpgm pro vypocet 'TANGENS' (op.kod #21) * rst CALSW X DEFB #31 X X ;dup DEFB #1F X sin(X) ;sin DEFB #01 sin(X) X ;swap DEFB #20 sin(X) cos(X) ;cos DEFB #05 sin(X)/cos(X)=tan(X) ;divide DEFB #38 ret * *podpgm pro vyypocet 'ARCUSTANGENS' (op.kod #24) * *nastava rozdeleni na tri pripady: *pro -1<X<1 :W=0 Y=X *pro 1<=X :W=PI/2 Y=-1/X *pro X<=-1 :W=-PI/2 Y=-1/X * call #3297 X do tvaru v plov.tecce ld A,(HL) prevzat exponent cp #81 1 < abs(X) ? jr C,TANGE1 ano rst CALSW X
37EB 37EC 37ED 37EE 37EF 37F0 37F1 37F2 37F3 37F5 37F6 37F8 37F9 37FA 37FB 37FC 37FD 37FE 37FF 3800 3801 3802 3803 3805 3807 380A 380D 3810 3814 3818 381B 3820 3825 382A 382F 3830 3831 3832 3833 3833 3833 3833 3834 3835 3836 3837 3838 3839 383A 383B 383C 383D 383E 383F 3840 3841 3842 3843 3843 3843
A1 1B 01 05 31 36 A3 01 00 1B 33 EF A0 01 31 31 04 31 0F A1 03 8C 10 13 55 58 5B 9E A0 63 E6 E9 EC F0 04 0F 38 C9
EF 31 31 04 A1 03 1B 28 A1 0F 05 24 31 0F 38 C9
DEFB #A1 X 1 DEFB #1B X -1 DEFB #01 -1 X DEFB #05 -1/X DEFB #31 -1/X -1/X DEFB #36 -1/X -1/X<0 DEFB #A3 -1/X -1/X<0 PI/2 DEFB #01 -1/X PI/2 -1/X<0 06 DEFB #00 #06 -1/X PI/2 DEFB #1B -1/X -PI/2 03 DEFB #33 #03 -1/X -PI/2 TANGE1 rst CALSW Y DEFB #A0 Y 0 TANGE2 DEFB #01 W Y DEFB #31 W Y Y DEFB #31 W Y Y Y DEFB #04 W Y Y*Y DEFB #31 W Y Y*Y Y*Y DEFB #0F W Y 2*Y*Y DEFB #A1 W Y 2*Y*Y 1 DEFB #03 W Y 2*Y*Y-1=Z DEFB #8C polynomicky rozvoj B2 DEFB #10 #B2 0E DEFB #13 #0E E4 8D DEFB #55 #E4 #8D 39 BC DEFB #58 #39 #BC 98 FD DEFB #5B #98 #FD 00 36 75 DEFB #9E #00 #36 #75 DB E8 B4 DEFB #A0 #DB #E8 #B4 42 C4 DEFB #63 #42 #C4 B5 09 36 DEFB #E6 #B5 #09 #36 #BE 36 73 1B DEFB #E9 #36 #73 #1B #5D D8 DE 63 DEFB #EC #D8 #DE #63 #BE 61 A1 B3 DEFB #F0 #61 #A1 #B3 #0C DEFB #04 W atnX DEFB #0F atn(X) DEFB #38 ret * *funkce 'ARCUSSINUS' (op.kod #22) * rst CALSW X DEFB #31 X X DEFB #31 X X X DEFB #04 X X*X DEFB #A1 X X*X 1 DEFB #03 X X*X-1 DEFB #1B X 1-X*X DEFB #28 X sqr(1-X*X) DEFB #A1 X sqr(1-X*X) 1 DEFB #0F X sqr(1-X*X)+1=Y' DEFB #05 X/Y'=tan(Y/2) DEFB #24 Y/2 DEFB #31 Y/2 Y/2 DEFB #0F Y=acs(X) DEFB #38 ret * *funkce 'ARCUSCOSINUS' (op.kod #23) *
;konst ;neg ;swap ;divide ;dup ;<0? ;konst ;swap ;jrt TANGE2 ;neg ;jr TANGE2 ;konst ;swap ;dup ;dup ;multi ;dup ;add ;konst ;sub
;multi ;add
;dup ;dup ;multi ;konst ;sub ;neg ;sqr ;konst ;add ;divide ;atn ;dup ;add
3843 3844 3845 3846 3847 3848 3849 384A 384A 384A 384A 384B 384C 384D 384F 3850 3851 3851 3851 3851 3852 3853 3854 3855 3857 3858 3859 385A 385D 385D 385E 385F 3860 3862 3863 3864 3865 3867 3868 3869 386A 386B 386C 386D 386E 386E 386E 386E 386E
EF 22 A3 03 1B 38 C9
EF 31 30 00 1E A2 38
EF 01 31 30 00 07 25 04 38 C3 C4 36 02 31 30 00 09 A0 01 37 00 06 A1 01 05 02 A1 38 C9
* *podpgm pro vypocet druhe odmocniny (op.kod #28) * rst CALSW X DEFB #31 X X ;dup DEFB #30 X X=0 ;=0? DEFB #00 #1E X ;jrt LASTVA DEFB #A2 X .5 ;konst DEFB #38 (na vypocet X^.5) * *podpgm pro vypocet 'X^Y' (op.kod #06) * rst CALSW X Y DEFB #01 Y X ;swap DEFB #31 Y X X ;dup DEFB #30 Y X X=0 ;=0? DEFB #00 #07 Y X ;jrt XZER DEFB #25 Y ln(X) ;ln DEFB #04 Y*ln(X) ;multi DEFB #38 jp #36C4 skok na vytvoreni exp(Y*ln(X)) * XZER DEFB #02 Y DEFB #31 Y Y ;dup DEFB #30 Y Y=0 ;=0? DEFB #00 #09 Y ;jrt ONEST DEFB #A0 Y 0 ;konst DEFB #01 0 Y ;swap DEFB #37 0 Y>0 ;>0? DEFB #00 #06 0 ;jrt LASTVA DEFB #A1 0 1 ;konst DEFB #01 1 0 ;swap DEFB #05 1/0 pro hlaseni 'Number too big' ONEST DEFB #02 ;drop DEFB #A1 1 ;konst LASTVA DEFB #38 ret * *zde az po generator znaku na adrese #3D00 *je ROM zaplnena pouze #FF * *============================================================