Print routine ohne OS

1, 2

Print routine ohne OS

von Heaven_tqa » Sa 7. Jul 2007, 16:53
hat mir jemand eine print routine, die ähnlich funktioniert als die OS routine?

im Compy Shop Atari Technik Handbuch ist sowas erwähnt, aber leider ohne listing.

sollte ähnlich funktionieren... sonst muss ich meine eigene schreiben... ;)

ich brauche eigentlich eine PUTCHAR routine...

von HiassofT » Sa 7. Jul 2007, 18:24
Kommt ganz drauf an, was Du haben willst. Üblicherweise hast Du ja einen fixen Screen-Aufbau, irgendwo ein paar Ziffern für den Highscore etc.

Da ist es am einfachsten, wenn Du direkt die Screen-Adressen nimmst und dorthin reinschreibst. Wenn Du mit normalem ATASCII Code arbeiten möchtest, mach Dir eine Hilfsroutine, die von ATASCII nach Screen Code konvertiert. Evtl. auch noch eine weitere Routine um eine Zahl (8 oder 16 bit) nach ASCII zu konvertieren. Das sieht dann zB so aus:

Code: Alles auswählen
lda #<text
sta textvec
lda #>text
sta textvec+1
lda #<hiscreen
sta screenvec
lda #>hiscreen
sta screenvec+1
ldy #textlen-1
jsr putscreen
...

putscreen:
lda (textvec),y
jsr toscreen ; von atascii nach screen code convertieren
sta (screenvec),y
dey
bpl putscreen
rts


so long,

Hias

von pps » Sa 7. Jul 2007, 18:30
Also im Prinzip mußt Du doch nur den Bildschirm in x & y aufteilen und dann ein sta screen+y,x machen.

Je nach Modus ist das natürlich mit ein wenig Berechnung verbunden.

Die richtigen y-Werte ergeben sich ja aus y*Bytes je Scanline

von Heaven_tqa » Sa 7. Jul 2007, 21:45
danke!

von robbifan » So 8. Jul 2007, 15:57
Code: Alles auswählen
START   = $0600

        .BANK
        * = START
        LDY #TEXTLEN-1
LOOP    LDA TEXT,Y
        STA (88),Y
        DEY
        BPL LOOP
        PLA ; back to BASIC
        RTS

TEXT    .SBYTE "Hallo!"
TEXTLEN = * - TEXT



dieses muster hatte ich hier im forum mal bekommen für basic, habe atasm genommen.

bload "d1:......" >>> laden in basic

a=usr($600) >>> starten in basic

Re: Print routine ohne OS

von cas » Mo 9. Jul 2007, 14:49
Heaven_tqa hat geschrieben:hat mir jemand eine print routine, die ähnlich funktioniert als die OS routine?

im Compy Shop Atari Technik Handbuch ist sowas erwähnt, aber leider ohne listing.

sollte ähnlich funktionieren... sonst muss ich meine eigene schreiben... ;)

ich brauche eigentlich eine PUTCHAR routine...


Hallo,

die Listings zum Compy SHop Technik Handbuch befinden sich alle auf der beigelegten Diskette.

Ich werde die Listings in den nächsten tagen auch mal in das Wiki stellen

Hier ist eine alternative Routine

http://strotmann.de/twiki/bin/view/APG/ ... tWithoutOs

Ciao

Carsten

Re: Print routine ohne OS

von cas » Mo 9. Jul 2007, 14:53
Heaven_tqa hat geschrieben:hat mir jemand eine print routine, die ähnlich funktioniert als die OS routine?

im Compy Shop Atari Technik Handbuch ist sowas erwähnt, aber leider ohne listing.

sollte ähnlich funktionieren... sonst muss ich meine eigene schreiben... ;)

ich brauche eigentlich eine PUTCHAR routine...


Die Diskette mit allen Listings aus dem Buch kann man hier laden

http://www.strotmann.de/twiki/bin/view/ ... ikHandbuch

von mp-one » Mo 9. Jul 2007, 17:15
Hallo Ihr,

ich hatte letztens ein ähnliches Problem. Ich wollte mir eine schnelle Ausgaberoutine für Kyan Pascal basteln. Gestern habe ich dazu erstmal eine Funktion zur Konvertierung eines ATASCII-Zeichens in die interne Darstellung gebastelt. Scheinbar gibt es dafür im ATARI keine Tabelle oder Routine!? Die Konvertierung klappt soweit. Ich muss das jetzt noch in eine Schleife/Subroutine packen, um z.B. alle Zeichen eines beliebigen Strings zu konvertieren. Für eigene Projekte in ASM ist der Code von "CMP #32" bis "SBC #32" interessant. Alles davor und danach ist Kyan (Aufrufstack) spezifisch. Zuvor muss noch das zu konvertierende Zeichen in den Accu geladen und anschließend an eine andere Stelle gesichert werden.

Vielleicht ist der Code hilfreich für den ein oder anderen und vielleicht gibt es einen Assembler-Freak, der mal schauen kann, ob man da noch was optimieren kann. Ich habe nämlich seit 15 Jahren zum erstenmal wieder was in ASM gemacht und es könnte sein, dass die Lösung etwas umständlich geraten ist - oder - falls es doch eine Tabelle/Routine im OS gibt sogar unnötig.

Gruß, Michael

>>>>

Source:

Code: Alles auswählen
(* Convert ATASCII to internal, Author:Michael P./WASEO/ABBUC/08.06.2007 *)
(* This is PUBLIC DOMAIN *)
Function AtascToInt(a:char):char;
begin
  AtascToInt := chr(0);
#A
     PHP
     LDY #6      ; Offset to ATASC-val (a)
     LDA (_SP),Y ; Load char to Accu
     CMP #32     ; >=32?       
     BCS C96     ; YES: Test for <96
     CLC
     ADC #64     ; NO: 0-31: +64
     BCC EX      ;     AND EXIT
C96  CMP #96     ; >=96?
     BCS C128    ; YES: TEST FOR <128
     SEC
     SBC #32     ; NO: 32-95:-32
     BCC EX      ;     AND EXIT
C128 CMP #128    ; >=128?
     BCS C160    ; YES: TEST FOR <160
     BCC EX   ; NO: 96-127= DO NOTHING
C160 CMP #160    ; >=160?
     BCS C224    ; YES: TEST FOR <224
     CLC
     ADC #64     ; NO: 128-159: +64
     BCC EX
C224 CMP #224    ; >=224?
     BCS EX ; YES: 224-255: DO NOTHING
     SEC
     SBC #32     ; NO: 160-223: -32
EX   LDY #5      ; OFFSET ATASCTOINT
     STA (_SP),Y ; STORE INTERNAL CHAR
     PLP         ;
#
END;

von cas » Mo 9. Jul 2007, 18:05
Hallo,

ich habe dies im Atari800 OS Listing gefunden (gekürzt, nur die ATASCII zu INT Umwandlung, noch nicht getestet!)

Code: Alles auswählen
; ATASCII im accu
ATAINTCONV:
  TAY          ; save atascii
  ROL A
  ROL A
  ROL A
  ROL A      ; calculate column for ATAINT Table
  AND #3
  TAX          ; X is now index to ATAINT Table
  TYA          ; restore atascii
  AND $9F  ; strip away column part
  ORA ATAINT,X  ; get Internal code
  RTS

ATAINT: $40,$00,$20,$60


Ciao

Carsten

von mp-one » Mo 9. Jul 2007, 18:32
cas hat geschrieben:Hallo,

ich habe dies im Atari800 OS Listing gefunden (gekürzt, nur die ATASCII zu INT Umwandlung, noch nicht getestet!)

Code: Alles auswählen
; ATASCII im accu
ATAINTCONV:
  TAY          ; save atascii
  ROL A
  ROL A
  ROL A
  ROL A      ; calculate column for ATAINT Table
  AND #3
  TAX          ; X is now index to ATAINT Table
  TYA          ; restore atascii
  AND $9F  ; strip away column part
  ORA ATAINT  ; get Internal code
  RTS

ATAINT: $40,$00,$20,$60


Ciao

Carsten


Ah ja, es wäre auch sehr merkwürdig gewesen, wenn sich da nichts gefunden hätte. Sieht echt kompakt aus, ich werde das bei Gelegenheit mal testen. Buuhuu, meine schöne Routine ;) !

M.

von cas » Mo 9. Jul 2007, 21:42
Die Routine aus dem Atari/CompyShop technik Handbuch ist nun im Wiki

http://www.strotmann.de/twiki/bin/view/ ... rintGrNull

von pps » Di 10. Jul 2007, 18:33
cas hat geschrieben:Hallo,

ich habe dies im Atari800 OS Listing gefunden (gekürzt, nur die ATASCII zu INT Umwandlung, noch nicht getestet!)

Code: Alles auswählen
; ATASCII im accu
ATAINTCONV:
  TAY          ; save atascii
  ROL A
  ROL A
  ROL A
  ROL A      ; calculate column for ATAINT Table
  AND #3
  TAX          ; X is now index to ATAINT Table
  TYA          ; restore atascii
  AND $9F  ; strip away column part
  ORA ATAINT  ; get Internal code
  RTS

ATAINT: $40,$00,$20,$60


Ciao

Carsten


Sollte da nicht beim ORA ATAINT lieber ORA ATAINT,X stehen? Oder habe ich was übersehen?

von cas » Di 10. Jul 2007, 18:43
pps hat geschrieben:Sollte da nicht beim ORA ATAINT lieber ORA ATAINT,X stehen? Oder habe ich was übersehen?


Korrekt, Meister!

Habe ich zu schnell abgetippt. Wie gesagt, nicht getestet. Aber die Idee wird klar.

Ciao

Carsten

von Heaven_tqa » Di 10. Jul 2007, 18:58
huj...die ist aber lang... ;) das geht bestimmt kompatker... ;)

ist echt die einzige OS-routine, welche ich benutze. wenn ich diese ersetze, kann ich das OS komplett abschalten und das RAM benutzen, das es belegt.




cas hat geschrieben:Die Routine aus dem Atari/CompyShop technik Handbuch ist nun im Wiki

http://www.strotmann.de/twiki/bin/view/ ... rintGrNull

von cas » Di 10. Jul 2007, 21:29
Heaven_tqa hat geschrieben:huj...die ist aber lang... ;) das geht bestimmt kompatker... ;)



Das ist ja auch eine "deluxe" Version, welche z. B. die Steier-Sonderzeichen mitbeachtet etc.

Wenn Du das nicht brauchst, kannst die die Routine zusammenstutzen oder meine Routine benutzen, welche ich weiter oben gepostet hatte.

Ciao

Carsten

von mp-one » Di 10. Jul 2007, 21:57
cas hat geschrieben:ich habe dies im Atari800 OS Listing gefunden (gekürzt, nur die ATASCII zu INT Umwandlung, noch nicht getestet!)


Hallo,

haben wir das OS Listing eigentlich in der Infothek? Ich hatte mir vor Jahren mal eine papierene Version auf der JHV gekauft aber als PDF wäre das auch nicht verkehrt.

Bye, Michael

von cas » Di 10. Jul 2007, 22:29
mp-one hat geschrieben:
cas hat geschrieben:ich habe dies im Atari800 OS Listing gefunden (gekürzt, nur die ATASCII zu INT Umwandlung, noch nicht getestet!)


Hallo,

haben wir das OS Listing eigentlich in der Infothek? Ich hatte mir vor Jahren mal eine papierene Version auf der JHV gekauft aber als PDF wäre das auch nicht verkehrt.

Bye, Michael


Ab nun ja:
http://strotmann.de/twiki/bin/view/Info ... sSourcePdf
http://strotmann.de/twiki/bin/view/APG/ ... rceListing

Carsten

von mp-one » Mi 11. Jul 2007, 18:00
Wow!

Carsten klasse, dass Du es online gestellt hast. Jetzt wird geschmökert! Danke!

M.

von mp-one » Do 19. Jul 2007, 15:42
Code: Alles auswählen
; ATASCII im accu
ATAINTCONV:
  TAY          ; save atascii
  ROL A
  ROL A
  ROL A
  ROL A      ; calculate column for ATAINT Table
  AND #3
  TAX          ; X is now index to ATAINT Table
  TYA          ; restore atascii
  AND $9F  ; strip away column part
  ORA ATAINT,X  ; get Internal code
  RTS
ATAINT: $40,$00,$20,$60


Hallo,

ich hatte ja letztens geschrieben, dass ich die obige Routine getestet habe. Jetz habe ich sie noch mal mit dem Assembler unter die Lupe genommen und glaube, dass sie nicht universell für alle ATASC-Codes funktioniert, sodern nur für einige Fälle. Dies sind scheinbar die Zeichen 0,32 und 96 also genau die Grenzen, wo jeweils eine andere Umrechnung (+64, -32, +/-0) erfolgen muss. Der Sinn ist mir allerdings nicht klar geworden. Hmmmm, schade eigentlich, aber vielleicht findet sich im OS-Listing noch etwas dazu, muss mal nachforschen. Hat jemand von Euch diese Routine mal getestet/benutzt?

Gruß,

Michael

von cas » Do 19. Jul 2007, 16:19
mp-one hat geschrieben:
Hallo,

ich hatte ja letztens geschrieben, dass ich die obige Routine getestet habe. Jetz habe ich sie noch mal mit dem Assembler unter die Lupe genommen und glaube, dass sie nicht universell für alle ATASC-Codes funktioniert, sodern nur für einige Fälle. Dies sind scheinbar die Zeichen 0,32 und 96 also genau die Grenzen, wo jeweils eine andere Umrechnung (+64, -32, +/-0) erfolgen muss. Der Sinn ist mir allerdings nicht klar geworden. Hmmmm, schade eigentlich, aber vielleicht findet sich im OS-Listing noch etwas dazu, muss mal nachforschen. Hat jemand von Euch diese Routine mal getestet/benutzt?

Gruß,

Michael


Ich werde die Routine am WE auf der Fujiama mal ausporbieren. Es wäre interessant zu schauen ob die gleiche Routine auch im XL OS ist, oder im "nachprogrammierten" OS des Atari++ Emulators (OS SRC ist beim Atari++ Emulator Quellcode dabei).

Carsten
1, 2