þþ  NŠLINKSOMETHQ†WARMST!NF…L0374;;$E762"N0Q>4†CHLINK;;Die folgende Routine dient zum#N+P†ZCHAIN;;Einf}gen (und loeschen) der 20$N1Q>5†CHLINK;;Byte langen Handler in die ein-%N.P†ZCHAIN;;fach verkettete lineare Liste.&N*…L0378%>;;Hier kommen die 20 von oben'N,;;wieder dazu(N)Q@†ZCHAIN7;;Wurde NIL (das letzte Li -)N >;;stenelement mit der Folge-*N3;;adresse $0000) erreicht ?+N O@†ZCHAIN7,NF…L0375;;Ja, Ende-N&Q@†ZCHAIN7;;Adresse des Folgeelemts.N$P†ZCHAIN;;in ZCHAIN speichern./N &†ZCHAIN0N( ‡CHECKFF;;PS }ber den Eintrag bilden1N"H…L0375;;<>$FF => Fehler & Ende2N ‰CALLVKTC1;;$E8943NE…L0375;;auch Fehler & Ende4N-D…L0378;;unbedingter Sprung, suche weiter.5N…L0374Q>;;WARMST war =06N(P†CHLINK;;CHLINK wird auf NIL gesetzt7NP†CHLINK8NQ>O9NH…L0381;;unbedingter Sprung:N …L0385Q>;N?N…L0375:;;Das ist das Ende.?N …L0383,@NQ…MEMLO;;$02E7ANO†DVSTAT;;$02EABNP…TEMP1;;$0312CNQ…MEMLO;;$02E8DNO†DVSTAT;;$02EBENP…TEMP1;;$0313FN;GNQ†MEMTOP;;$02E5HNS…TEMP1;;$0312INQ†MEMTOP;;$02E6JNS…TEMP1;;$0313KNE…L0384;;$E7A2LN …L0387Q>NMN …L0381?NN ‡DCBINIT;;$E7BEON!…L0385;;$E76EPN…L0384Q†DVSTAT;;$02ECQN$…MEMLO;;$02E7RN&†DVSTAT;;$02ECSN$…MEMLO;;$02E8TN&†DVSTAT;;$02EDUN ˆINITLOAD;;$E7DEVNG…L0387;;$E799WN;XN …LINK1;;$E89EYNE…L0387;;$E799ZND…L0385;;$E76E[N‡DCBINIT5;;Akku retten\N$> ]N4…L0390Q‰TABSIOINI9;;TABSIOINI in den DCB kopieren^N P†DDEVIC9_N0`N!I…L0390;;Schon alle 10 Bytes ?aN('…DAUX2;;Ja, Laufwerksnummer in DAUX2bN7cN2P…DAUX1;;1. Zeichen aus dem Puffer (Ger{tename)dN !„SIOVeN‰TABSIOINI O;;DDEVICfN ;;DUNITgN @;;DCOMNDhN @;;DSTATiN †DVSTAT;;DBUFLOjN ;;DTIMLOkN ;;DBYTLOlNˆINITLOADP…TEMP1mN$>nN &…TEMP1oN0pN &…TEMP3qN9Q†DVSTAT;;Wenn ($02EC) ungerade, dann um 1 erhoehenrNW?sND…L0391;;ist geradetN#†DVSTAT;;ungerade => +1uNH…L0391;;Ergebnis < 8 BitvN8#†DVSTAT;;#$FF wurde }berschritten, {ndere HI-BytewN(…L0391Q†DVSTAT;;(Loadadr.)=($02EC)xN P†LOADADyNQ†DVSTATzNP†LOADAD{NQ>4‡INCLOAD;;(GBYTEA)=$E816|N P†GBYTEA}NQ>5‡INCLOAD~NP†GBYTEANQ>€€NP†ZLOADA;;$02D3N!†LOADER;;$C745‚N2‡INCLOAD$…TEMP3;;W{re INC TEMP3 nicht k}rzer ?!ƒN2„N&…TEMP3;;$0315…NF…L0393;;$E827†N…L0396$…TEMP3;;$0315‡NQ†CASBUF€9;;$037DˆN,;;kein Fehler‰N:ŠN…L0393Q>†BRKABT‹NP…TEMP3;;$0315ŒN ˆDCBXINIT;;$E833NI…L0396;;$E81FŽN;;;signalisiere FehlerN:N'ˆDCBXINIT$> ;;Kopiere SIOTAB in DCB‘N…L0398Q†SIOTAB9’N P†DDEVIC9“N0”N I…L0398•N $…TEMP1–N &…DAUX1—N2˜N &…TEMP1™N Q…TEMP1šN P†DDEVIC›N !„SIOVœNX;N0X;Initialisierungswerte f}r das NOTE-KommandožN†SIOTAB ;;DDEVICŸN ;;DUNIT N &;;DCOMND NOTE-Kommando¡N @;;DSTATS SIO-Read¢N †CASBUF;;DBUFLO£N! ;;DTIMLO Timeout 30 sec.¤N €;;DBYTLO¥N ;;DAUX1,2¦N2‰SEARCHLIS'…TEMP1;;In A und Y wird eine Adresse§NP…TEMP1;;}bergeben.¨N4Q>4†CHLINK;;CHLINK zeigt auf die Adresse einer©N+P†ZCHAIN;;Liste, in der jeder Eintrag 20ªN3Q>5†CHLINK;;Byte lang ist. Die ersten 16 Byte«N/P†ZCHAIN;;umfassen den Ger{tehandler, die¬N0…L0403%>;;letzten 2 sind die Adresse, unter­N0Q@†ZCHAIN7;;der der n{chste Eintrag zu finden®N>;;ist, usw.¯N3°N0Q@†ZCHAIN7;;Ist die }bergebene Adresse gleich±N)R…TEMP1;;der, die in ZCHAIN steht ?²NH…L0400;;HI-Byte nein³N (…TEMP1´NH…L0400;;LO-Byte neinµN(,;;signal. kein Fehler. Adresse wurde¶N(:;;gefunden & steht HI in A, LO in X.·N1…L0400R>;;Das letzte Listenelement (NIL) hat¸N#H…L0401;;als Folgeadresse $0000.¹N((>;;Wenn bei der Suche NIL erreichtºN.H…L0401;;wird, endet die Suche mit gestztem»N(…L0402;;;Carry-Flag als Fehleranzeige¼N :;;hier.½N)…L0401&†ZCHAIN;;Folgeadresse speichern¾NP†ZCHAIN¿N1 ‡CHECKFF;;Pr}fsumme }ber Byte 0-17, wenn<>$FFÀN(H…L0402;;enth{lt A den Rest => FehlerÁN.F…L0403;;kein Fehler, Pr}fsumme ok, weiter.ÂN‰CALLVKTC1;ÃN6ÄNEˆLINKINIT;;$E8C0ÅN>„LINKP†DVSTAT;;Diese Routine kn}pft einen neuen Handler,ÆN9'†DVSTAT;;dessen Adresse LO in Y, HI in A }bergebenÇN3…LINK16;;wird, an das Ende einer bestehenden an.ÈN0Q>;;Das letzte Element hat als FolgeadresseÉN,?;;$0000=NIL. CARRY entscheidet }ber eineÊN+ ‰SEARCHLIS;;Aenderung von MEMLO (s.u.).ËN+E‡LINKERR;;Nicht gefunden, Fehler & EndeÌN(%>;;Der Zeiger des letzten EintragsÍN9Q†DVSTAT;;wird durch die Adresse des neuen HandlersÎNP@†ZCHAIN7;;ersetzt.ÏN>ÐN3ÑNQ†DVSTATÒN P@†ZCHAIN7ÓN3&†ZCHAIN;;Gleichzeitig erh{lt ZCHAIN die AdresseÔN4P†ZCHAIN;;des neuen Eintrags, dessen Zeiger soÕN%Q>;;auf NIL gesetzt werden kann.ÖNP@†ZCHAIN7;;HI×N1ØNP@†ZCHAIN7;;LOÙN=ˆLINKINIT ‡CALLVKT;;Indirekter Aufruf der Init-Routine desÚN'DˆLINKSTST;;neuen Eintrags. Fehler ?ÛN-Q†DVSTAT;;Ja, Eintrag wieder entfernen.ÜN%†DVSTATÝN †UNLINKÞN5‡LINKERR8;;Kam zu Beginn drauf, muss wieder runterßN;;;signalisiere FehleràN$:;;Das ist auch ein Ende von LINKáN6ˆLINKSTST8;;Ist LINK mit gesetztem CARRY aufgerufenâNEˆLINKSMEM;;worden ? Ja, ->ãN-Q>;;Nein, loesche Byte 16 & 17 des neuenäN%>;;Eintrags.åN2P@†ZCHAIN7;;So bleibt MEMLO gleich unver{ndert.æN3çN P@†ZCHAIN7èN ˆLINKSMEM,éN%>;;16 Bit AdditionêN(Q…MEMLO;;(MEMLO)=(MEMLO)+(Byte 16,17)ëN O@†ZCHAIN7ìN P…MEMLOíN3îN Q…MEMLOïN O@†ZCHAIN7ðN P…MEMLOñN%>;;Loesche Pr}fsummenbyteòNQ>óN P@†ZCHAIN7ôN1 ‡CHECKFF;;Berechne die Pr}fsumme des EintragsõN%>;;und speichere sieöN P@†ZCHAIN7;;im Pr}fsummenbyte÷N,;;signalisiere kein FehlerøN :;;Das ist das Ende von LINK.ùN,‡CALLVKT,;;Diese Routine springt indirektúN,Q†ZCHAIN;;die Initialisierungsroutine desûNO> ;;Handlers an.üN-P…TEMP1;;(Ab Byte 12 steht dort JMP ?INIT)ýNQ†ZCHAINþNO>ÿN P…TEMP1O !@…TEMP1:O6‰JMPSETVBL!†SETVBL;;Im alten OS begann hier SETVBL.O7†UNLINK ‰SEARCHLIS;;A & Y enthalten die Adresse (L).O#E…L0410;;Element nicht gefunden.O,?;;A enth{lt das HI-Byte der Adresse (L).O+Q†ZCHAIN;;Adresse des vorherg. ElementesO5;;auf den Stapel retten.OQ†ZCHAINO5 O+&†ZCHAIN;;Adresse des zu loeschenden El. O'†ZCHAIN O*Q†COLDST;;Bei gesetztem COLDST wird das O H…L0411;;Element geloescht -> O%>O ,;;oderOQ@†ZCHAIN7;;wenn Byte 16O 3;;undOO@†ZCHAIN7;;Byte 17O H…L0412O' ‡CHECKFF;;und die Pr}fsumme =0 sindO H…L0412O …L0411%>O.Q@†ZCHAIN7;;Das zu loeschende (L) zeigt aufO>;;das folgende (F) Element.O3;;Adresse (F) in X,YO Q@†ZCHAIN7O?O$7;;Auf dem Stapel ist die AdresseO0P†ZCHAIN;;des vorhergehenden (V) Elements.O7O P†ZCHAINO"C;;Aus X und Y wird die Adresse O&%>;;von (F) in den Zeiger von (V)!OP@†ZCHAIN7;;eingesetzt."O!1;;Damit zeigt (V) auf (F) und#OA;;(L) ist entfernt.$O P@†ZCHAIN7%O,;;ok&O :;;Ende'O&…L04127;;Adresse von (V) vom Stapel(O7)O…L0410;;;signalisiere Fehler*O :;;Ende+O+,O+-O/A¨SIO - Serial Input and Output ControllerA