^:U.ALOCAT;Stelle n Bloecke je 40 Byte bereitU3 == = ===4=d=======d=U*NUMDLE;Number of Display List EntriesU3 == ==/=/=_=_=a=a=a=a== ==aU3 == =='='=O=O=A=A=A=A== ==AU1ANCONV;Wandele Graphics-Befehl in ANTIC-CodeU3 ==== = = = ======= =U2PAGETB;Seitengrenze kann }berschritten werdenU3 ===============U DHLINEU3 ===============UCOLUMN;Anzahl der SpaltenU3 (===(=P=P===@=P=P=P=(=(==UNOROWS;Anzahl der ReihenU3 == ==0=0=`=`====== ==U DIV2TBV3 ===============VDMASKT ==V =0= =VMASKTB =@= =V ===V/NEUDEVICE5;;HI-Byte der }bergebenen AdresseV C;;LO-V5VL0510A;;Ger{tename V%$>;;HATABS von vorne Durchsuchen V-L0512RHATABS9;;Ger{t schon eingetragen ? VFL0511;;Ja V 2;;1 Eintrag ist 3 Byte lang. V2V2V(>";;HATABS Ende ?VGL0512;;Nein ->V$>;;Wieder von vorneV?;;Ger{tenamen rettenVQ>;;Freien Eintrag suchenVL0506RHATABS9;;Frei ?VFL0513;;Ja ->V L05072V2V2V(>";;HATABS Ende ?VGL0506;;Nein ->V7;;Adresse vom Stapel holenV7V %>;;Flag: Kein Eintrag freiV%;;;Eintrag wurde nicht vorgenommenV: V$L05117;;Eintrag bereits gefunden!V!?;;Adresse vom Stapel in Y & A"V7;;X zeigt auf die bereits#V"2;;vorhandene Adresse in HATABS$V%;;;Eintrag wurde nicht vorgenommen%V:&VL0513C;Ger{tename'VPHATABS9;;eintragen(V7)VPHATABS9;;Adresse LO*V7+VPHATABS9;;Adresse HI,V,;;Eintrag wurde vorgenommen-V:.VSPECHANDL%>/V,Q@ICBUFZ7;;Erstes Zeichen aus dem Puffer0V%ICDNOZ;;Ger{tenummer1V DCBINIT2VIL0514;;ok3V/%>NONDEV;;Fehler: Nicht existierendes Ger{t4V:5V L0514Q>6VPICHIDZ;;$00207V*Q>4PUTBYTE1;;Adresse von PUTBYTE1-18V PICPUTZ9VQ>5PUTBYTE1:VPICPUTZ;VQDVSTAT;;$02ECV%>?VQ@ICBUFZ7;;Ger{tename@V PICAX39AV %>;;okBV:CV PUTBYTE15DVAEV5FV+M>;;Ist die Kanalnummer ein ganzzahligGV'HL0515;;Vielfaches von 16 ? Nein ->HV(>;;Ist die Kanal-nr. >8 ?IVIL0515;;Ja ->JV QHNDLODKV HL0516LV/%>NONDEV;;Fehler: Nicht existierendes Ger{tMV L05177NV7OV)>;;Setze flagsPV:QV-L0515%>BADIOC;;Fehler: Falsche Kanal-nr.RVGL0517;;UnbedingtSV)L0516 =.=;;STX $002E (Kanal-nr.)TV%>;;Kopiere IOCB Nr. XUV!L0518QICHID9;;in Page 0 IOCBVV PICHIDZ8WV2XV3YV")> ;;Schon alle 12 Eintra{ge ?ZVGL0518;;Nein ->[V PREPLINK\VGL0517;;bei Fehler]V7;;Adresse vom Stapel in X,Y^V>_V7`V?aV!QICPUTZ;;Indirekter SprungbV5cV QICPUTZdV5eVCfV1%>FNCNOT;;Fehler: Funktion nicht programmiertgV:hVFREI2 ===iV =jV!GOCASMOTONkV EINITlV KINITmV*SINITQ>;;Loesche letzten TastendrucknVPCHoVQRAMSIZ;;Obergrenze RAMpV PRAMTOPqVQ>@;;Nur GrossbuchstabenrV PSHFLOKsV'Q>4KEYDEF;;TastaturbelegungstabelletV PVKEYDEFuV Q>5KEYDEFvVPVKEYDEFwV$Q>4FKDEF;;FunktionstastentabellexV PVFKDEFyV Q>5FKDEFzVPVFKDEF{V:|V3SOPENQICAX2Z;;Lese AUX2 Bit 0-3 = Graphikstufe}VM>~V$HOPNCOM;;Es ist nicht Graphics 0V*EOPENQICAX1Z;;Bit 4 (Textfenster) undVM>;;Bit 5 (Clear-Screen)VPICAX1Z;;ausmaskieren.VQ>;;Editor nur in GR. 0V OPNCOMPDINDEX;;GraphikstufeVR>;;Ist sie < 16 ?V2DOPNCOM1;;Ja ->. Nein gibt es eigentlich nichtV*Q>BADMOD;;Fehler: Falsche GraphikstufeV !DOPNERRV%OPNCOM1Q>;;Normaler ZeichensatzV PCHBASV$Q>;;Internationaler ZeichensatzV PCHSALTVQ>V$PCHACT;;Inverse Zeichen = inversV.PSDMCTL;;Beim n{chsten VBL DMA ausschaltenVQ>;;Status okVPDSTAT;;Display-StatusVQ>;;Erlaube IRQ durch eineV!LPOKMSK;;Taste oder durch dieV"PPOKMSK;;BREAK-Taste und allesVPIRQEN;;was erlaubt war.VQ>@;;Erlaube VBIV PNMIENV*FINE;;Ist Bit 7 gesetzt ?VINOATTRACT;;Nein ->V'Q>4DLIFINE;;Per DLI: COLOR2 EOR $4FVPVDSLST;;AND $4E >> COLPF1VQ>5DLIFINEVPVDSLSTVQ>;;Erlaube VBI und DLIVNOATTRACTPNMIENV&Q>;;Graphikstufe des TextfenstersV PTINDEXV PADRESSV0PSWPFLG;;Cursordaten Textfenster (Graphikf.)VPCRSINH;;Cursor sichtbarV%>;;Setze alle TabulatorenVQ>;;in GrundstellungVCLRTBSPTABMAP8V1V ICLRTBSV&$>;;Farbregister GrundeinstellungVDOPEN8QCOLRTB9V PCOLOR09V0V IDOPEN8V0%RAMTOP;;Bsp.: TXTMSC=$2C40 bei RAMTOP=$3000V1V'TXTMSC;;(TXTMSC)=$xF60VQ>`V PTXTMSCV$DINDEX;;GraphikstufeV%QANCONV9;;in Antic-Code umwandelnVPHOLD1;;zwischenspeichernV QRAMTOPVPADRESSV$%ALOCAT9;;Es werden von (ADRESS)V'DOPEN1Q>(;;Y*40 Byte abgezogen undV DBSUB;;es wird getestet, obV1;;(ADRESS)>(APPMHI) ist.V HDOPEN1VQGPRIOR;;Loesche GTIA-ModiVM>?VPMLTTMPV?V(>;;Graphik < 8 ?VDNOT8;;Ja ->V(>;;Graphik 15 ?VFGR15;;Ja ->V(> ;;Graphik 12-14 ?VENOT8;;Ja ->VA;;Graphik 8-11VW?;;Bit 7,6 <- Bit 1,0VW?;;VW?;;VM>;;Nur Bit 7+6, ehem. 1+0V$LMLTTMP;;Priorit{ten einodernV?V/GR15Q>;;Zur Seitengrenze noch 16 abziehenV DBSUBV(> ;;Ist es Graphik 11 ?VHNOT8;;Nein ->VQ>V PCOLOR4VNOT8'GPRIORVQADRESS;;($58)=($64)V PSAVMSCVQADRESSVPSAVMSCV*VBWAITQVCOUNT;;Warte bis zum n{chstenVR>z;;VBL mit der ErstellungVHVBWAIT;;Displaylist.V# DBDEC;;DL unter Bildschirm-RAMVQPAGETB9;;Wird SeitengrenzeV#FNOMOD;;}berschritten ? Nein ->V!Q>;;Noch eine Seite abziehenV PADRESSV"ADRESSV&NOMOD DBDDEC;;(ADRESS)=(ADRESS)-1VQADRESS;;($68)=($64)V PSAVADRVQADRESSVPSAVADRV*Q>A;;(ANTIC: erwarte VBL, jmp Anf. DL)V% STORE;;sta (ADRESS), DBDEC & rtsV &MLTTMPVQ>;;Anzahl der TextzeilenV PBOTSCRV'QDINDEX;;Verhindere Textfenster beiVR> ;;GR. 9-11VEMXD;;Ist Gr.12-15 ->VR> VENOTMXD;;Ist GR. 9-11 ->V'MXDQICAX1Z;;Mixed Mode gew}nscht ?VM>VFNOTMXD;;Nein ->VQ>VPBOTSCR;;Ja, 4 TextzeilenV$>;;3/4 TextzeilenV)QFINE;;Finescrolling im Textfenster ?VFDOPEN2;;Nein ->V+ SL2LDX;;Letzten 2 Zeilen, $02,$A2, dexVDOPEN2Q>V( FSCROLEN;;evtl. Bit 5 setzen, STOREV0V&IDOPEN2;;Noch nicht alle Zeilen ->V%RAMTOP;;Adresse HIV1;;-1WC;;Load Mem Scan Adr. HIW STOREW Q>`;;LOW STOREW Q>B;;GR.0-Zeile + LMS-BefehlW FSCROLENW,WQ>;;Mixed ModeW!OMLTTMP;;hier: Graphik (0-15) W?;;als Index W!$NUMDLE8;;Anzahl der Eintr{ge WHDOPEN3;;Unbedingt W"NOTMXD%MLTTMP;;Graphik (0-15) W!$NUMDLE8;;Anzahl der Eintr{geWQDINDEX;;Ist es Graphik 0 ?WHDOPEN3;;Nein ->WQFINE;;Finescrolling ?WFDOPEN3;;Nein ->W+ SL2LDX;;Letzten 2 Zeilen: $02,$A2, dexW#Q>";;GR.0-Zeile mit H-ScrollingW PHOLD1WDOPEN3QHOLD1;;Antic-CodeW STORE;;Zeile in DL einf}genW0;;n{chste ZeileWHDOPEN3;;weiterW QDINDEXWR>;;Ist es GR. 0-7WDDOPEN5;;Ja ->WR>;;Ist es Gr. 15WFDOPN3B;;Ja ->WR> ;;Ist es Gr. 12-14WEDOPEN5;;Ja -> W1DOPN3B$>];;Anzahl noch zu machender Eintr{ge!W QRAMTOP"W;#WS>$W STORE;;Speicherz{hler HI%WQ>&W STORE;;Speicherz{hler LO'WQHOLD1;;Antic: DL-Code(WL>@;;LMS-Befehl einodern)W STORE*W(DOPEN4QHOLD1;;Die restlichen Zeilen+W STORE;;in die DL,W0-W HDOPEN4.W5DOPEN5QSAVMSC;;Anfangsadr. Bildschirmspeicher/W STORE;;HI-Byte0W QSAVMSC1W STORE;;LO-Byte2WQHOLD1;;Antic: Graphik-Code3WL>@;;LMS-Befehl einodern4W STORE5WQ>p;;8 Leerzeilen6W STORE7WQ>p;;8 Leerzeilen8W STORE9W"QADRESS;;Anfangsadresse der DL:W PVDLIST;WQADRESSp;;8 Leerzeilen>W STORE?W#QADRESS;;Untergrenze Bildschirm@W#PMEMTOP;;gleich Obergrenze freiAW$QADRESS;;verf}gbarer SpeicherBWPMEMTOPCW%>;;Anfangsadresse der DLDW$QVDLIST;;muss noch ans Ende nachEWP@SAVADR7;;dem SprungbefehlFW3;;eingetragen werden.GWQVDLISTHW P@SAVADR7IW QDSTATJWIDOPEN9;;okKW-DOPNERRPDERRF;;Fehler beim eroeffnen desLW! EOPEN;;Bidlschirms => EditorMW#QDERRF;;wird anstatt geoeffnet.NW%>OW 'DERRFPW?;;Fehler und Flags setzenQW:RW0DOPEN9QICAX1Z;;Bildschirmseicher loeschen ?SWM> TWHDOPEN7;;Nein ->UW CLRSCRVWPTXTROW;;Cursor Home imWWQLMARGN;;TextfensterXW PTXTCOLYWDOPEN7Q>";;DMA einschaltenZW LSDMCTL[W PSDMCTL\W !RETURM]W*SGET RANGE;;Cursorposition/Begrenzung^W GETPLT;;Zeichen einlesen_W$ INATAC;;In ASCII-Code umwandeln`W$ INCRSB;;Cursorposition erhoehenaW#!RETUR1;;Gelesenes Zeichen in AbW6GETPLT CONVERT;;Reihe/Spalte in Adresse umrechnencWQ@ADRESS7;;Zeichen lesendW0MDMASK;;Display Mask, z.Zt. verwandtes PixeleW:SHIFTDVSHFAMT;;vorher =DMASK. Ein Pixel kann < 1 BytefW1ESHIFT1;;sein. Die errechnete Adresse muss ingW(V?;;bis zu 8 Pixel unterteilt werden.hWISHIFTD;;Unbedingt.iW-SHIFT1PCHAR;;Gelesenes Zeichen speichernjWR>;;Flaggen setzen.kW:lW-SPUTPATACHR;;Ist das eingegebene ZeichenmW#R>};;Clear-Screen -CHR$(125)- ?nWHSPUT1;;Nein ->oW CLRSCRpW !RETURMqWSPUT1 RANGErWOUTCHEQATACHR;;Ist es CR ?sWR>tWHOUTCHB;;Nein ->uW DOCRWS;;CR & evtl. scrollenvW !RETURMwW$OUTCHB OUTPLT;;Zeichen ausgebenxW$ INCRSR;;Cursorposition erhoehenyW !RETURMzW-OUTPLTQSSFLAG;;ctrl-1, Bildschirmausgabe{WHOUTPLT;;angehalten ->|W$>}W#CRLOOPQROWCRS9;;Cursorposition~W$POLDROW9;;Spalte & Reihe retten.W0W ICRLOOPW'QATACHR;;Wandle ATASCII in internenW?;;Code um.WU?;;Bit 6+5 >> 1+0WU?WU?WU?WM>;;Nur Bit 1+0W>;;Als Zeiger benutzenW C;;ATASCIIWM>;;Ohne Bit 6+5WLATAINT9;;Neues Bit 6+5W*OUTCH2PCHAR;;Zeichen im internen CodeW- CONVERT;;Reihe/Spalte in Adresse wandelnW QCHARWSHIFTUVSHFAMT;;s. SHIFTDW ESHIFT2WT?W !SHIFTUW$SHIFT2MDMASK;;Derzeitiges PixelWPTMPCHR;;rettenWQDMASK;;Invertiere MaskeW)N>;;Pixel an Cursorposition loeschenW(M@ADRESS7;;Das restliche Byte bleibtW#LTMPCHR;;Neues Zeichen einodernW/P@ADRESS7;;Komplettes Byte wieder speichernW:W4RETURM GETPLT;;(RETURn from Monitor) Cursor ausW POLDCHRW$$DINDEX;;Unsichtbarer Cursor beiWHRETUR1;;Graphik ->W)$CRSINH;;Text. Soll Cursor unsichtbarWHRETUR1;;sein ? Ja ->W'N>;;Zeichen Invertieren (simuliertW" OUTCH2;;Cursor) und ausgeben.W ESTATSW KCLOSEW KOPENW KSTATSW SSTATSWRETUR1%DSTATW !RETUR2W7TESTROMEN!SWITCHROM;;Im alten OS stand hier SIGNONWRETUR2Q>;;Status okW PDSTATWQATACHR;;Zeichen in AW ESPECLWKPUTW3KSPECL:;;(Funktion nicht vorhanden, R}cksprung)W ECLOSEW!SCLOSE*FINE;;Bit 7 gesetzt ?WIRETUR1;;Nein ->WQ>@;;DLI aus, VBI anW PNMIENWQ>;;Kein FinescrollingW PFINEW!Q>4SYRTI;;Zeigt auf RTI $C0CEW PVDSLSTW Q>5SYRTIWPVDSLSTW !EOPENWEGET SWAPW ERANGEW QBUFCNT;;Ist was im Puffer ?WHEGETC3;;Ja ->W'QROWCRS;;Nein, PufferanfangsadresseWPBUFSTR;;speichernW QCOLCRSWPBUFSTRW1EGETC1 KGET;;Lasst uns unseren Puffer f}llenW'DSTAT;;Tastatur StatusWQATACHR;;Ist es (RETURN) ?WR>WFEGETC2;;Ja ->W DOSS;;Nein, ausgebenW, SWAP;;Austausch: Graph./TextcursordatenW*QLOGCOL;;BEEP, falls die L{nge der bisW*R>q;;jetzt eingegebenen Zeile 113 ByteWHEGETC6;;erreicht. Nein ->W BELLW$EGETC6!EGETC1;;Weiter einlesen.W(EGETC2 OFFCRS;;Zeichen unter CursorW* DOBUFC;;Errechne aktuelle Pufferl{ngeW!QBUFSTR;;Cursor wieder an denW(PROWCRS;;Zeilenanfang (zum Lesen derWQBUFSTR;;Zeile)W PCOLCRSWEGETC3QBUFCNT;;Pufferl{ngeWFEGETC5;;=0 ->WEGETC7"BUFCNTWFEGETC5;;Puffer leer ->W(QDSTAT;;Bei einem Fehler wird BUFCNTW#GEGETC7;;auf 0 heruntergez{hlt.W' SGET;;Zeichen vom Bildschirm lesenW PATACHRW !SWAPW*EGETC5 DOCRWS;;CR und evtl. scrollen.WQ>W PATACHRW RETURM;;u.a. Cursor anW'DSTAT;;Tastatur StatusW"!SWAP;;Cursordaten austauschenW$JSRIND!@ADRESS:;;Indirektes JSRWEPUTPATACHRW SWAP;;Schau bei SWAP nachW ERANGEW,Q>;;F}r die Funktionstasten des 1200 XLW1PSUPERF;;(Krieg ich OHNE zus. Tasten so hin!)W3DOSS OFFCRS;;(Bei US Vers.: ctrl-4 bis ctrl-0)W) TSTCTL;;Ist es ein Control-Zeichen ?WFEOUTC5;;Ja ->W5EOUTC6TESCFLG;;Escape klappt nur einamal/ZeichenW OUTCHE;;Zeichen ausgebenW !SWAPW2EOUTC5QDSPFLG;;Wenn <>0, dann Control-ZeichenW%LESCFLG;;auf Bildschirm ausgeben,WHEOUTC6;;nicht ausf}hren!WTESCFLG;;$02A2W%2;;Zeigt nach R}ckkehr auf EintragW"QSUPERF;;1200XL SonderfunktionWFL0593;;Nein ->WA;;Zum Rechnen:W ,;;Am Ende der Tabelle stehenWO>-;;die Adressen f}r dieW>;;SonderfunktionenWL0593QCNTRLS9W PADRESSWQCNTRLS9XPADRESSX JSRIND;;Funktion ausf}hrenX RETURMX#!SWAP;;Ende des Editor-HandlersX#KGETC2Q>;;Loesche TastendruckXPCHX&KGETQ>;;Loesche Flag f}r 1200 XLX"PSUPERF;;SonderfunktionstastenX'QICAX1Z;;Automatisches einlesen vom XV?;;Bildschirm ? XEGETOUT;;Ja -> X Q>BRKABT X $BRKKEY XFK7;;BREAK wurde gedr}cktXQCH;;Wurde irgendeine TasteXR>;;gedr}ckt ?XFKGET;;Nein ->XPHOLDCH;;Tastencode rettenX$>;;Letzten TastendruckX&CH;;loeschenX&$NOCLIK;;Tastaturklick ausf}hren ?XHKGETC3;;Nein ->X CLICK;;(A unver{ndert)XKGETC3?;;enth{lt TastencodeX!)>;;Control+Shift gedr}ckt ?X$EKGETC2;;Ja, Eingabe ignorieren.X*Q@VKEYDEF7;;Entsprechend der Tastatur-X/ASCC01PATACHR;;belegungstabelle umwandeln.X>X&GKGETC0;;Besondere EdierfunktionenX!K6;;Eingabe okX+KGETC0R>;;Ung}ltige Tastenkombination X FKGETC2!XR>;;Atari-Taste"XHKGETC1;;Nein ->#X QINVFLG$XN>%X PINVFLG&XEKGETC2;;Unbedingt'XKGETC1R>;;Caps/Lower(XHK1;;Nein ->)X"QSHFLOK;;Ist es Kleinschrift ?*XFK9;;Ja ->+XQ>;;Aber jetzt.,X PSHFLOK-XFKGETC2;;Unbedingt.XK1R>;;Shift + Caps/Lower/XHK20XK9Q>@;;Nur Grosschrift1X PSHFLOK2XHKGETC2;;Unbedingt3XK2R>;;Ctrl + Caps/Lower4XHK35XQ>;;Auf Graphikzeichen6XPSHFLOK;;umschalten.7X !KGETC28XK3R>;;Ctlr-3 (EOF)9X HL0609:XQ>EOFERR;;Fehler: Dateiende;X K7PDSTAT;;(RETURN)>X!K8?X,L0609R>;;Tastaturklick an/aus (ctrl-4)@X HL0611AXQNOCLIK;;Flag umsetzenBXN>CX PNOCLIKDX)HL0612;;Wenn gesetz wurde, kein ClickEX CLICKFXL0612!KGETC2GX/L0611R>;;CRSRHM, CRSRBT, CRSRLM, CRSRRM ?HX%EL0613;;Ja (ctrl-5 ... ctrl-8) ->IX!R>;;Bis $89 hatten wir schonJX DL0612KX'S>;;CRSRUP, CRSRDN, CRSRLF, CRSRRTLX/THOLDCH;;Bei der Eingabe CONTROL gedr}ckt ?MX(IL0614;;Nein, normale CursorbewegungNX!L>;;Ja, Superf.: HM,BT,LM,RMOX L0614?PX-Q@VFKDEF7;;Aus der FunktionstastentabelleQX !ASCC01RX L0613R>SXEK6;;Nicht mehr definiertTXR>UXDL0612;;M}sste gesetzt seinVXS>r;;-> $1C, $1D, $1E, $1FWX#SUPERF;;Flag setzenXXHK8;;UnbedingtYX+K6QHOLDCH;;Wurde bei der Eingabe SHIFTZX R>@;;oder CONTROL gedr}ckt ?[XEK5;;Ja ->\X QATACHR]XR>a;;Kleinbuchstaben ?^XDK5;;Nein ->_X R>{;;Kleinbuchstaben 'a-z' ?`XEK5;;Nein ->aX"QSHFLOK;;Ja, nur Grosschrift ?bXFK5;;Nein ->cXLHOLDCH;;Ja, einoderndX !KGETC3eX"K5 TSTCTL;;=0, falls gefundenfXFK4;;Ja ->gX)QATACHR;;Kein Controlzeichen, sondernhX!NINVFLG;;inverse Darstellung.iXK8PATACHRjXK4!RETUR1kX"AControl Character ProcessorA