Miniterminál pro Apple-1 a Multi I/O Card

Využití sériáku na Multi I/O kartě pro počítače Apple-1 a Replica-1.

Nesetkal jsem se ještě s žádným rozumným programem pro Multi I/O kartu, který by využíval její sériák.
Je to škoda, protože pro Apple-1 a Replicu-1 se jedná o dost podstatné propojení se světem.
Ponechme teď stranou využití mluvícího čipu, paralelního portu a programátoru EEPROM.
Nepotkal jsem žádný takový program, kromě kopie Wozniakova monitoru, který operace s obrazovkou a klávesnicí přesměrvává na sériák na kartě (a který není plnohodnotně využitelný, protože je uložen v RAM a programy využívající rutin Monitoru pak zákonitě skáčí na původní rutiny v ROM, pracující standardně s klávesnicí a monitorem a jejich výstup se tedy na sériáku neobjeví).

Vzhledem k tomu, že jsem chtěl k Replice-1 připojit ConnectOne WiFi modul, a připojit si tento klon historicky velmi důležitého osmibitu bezdrátově do Internetu, musel jsem si pomoci sám.
Výsledkem je krátký a jednoduchoučký miniterminál, který prostě to, co napíšete, pošle na sériák, a to, co přijde po sériáku, zobrazí na obrazovce.

Miniterminálu je jedno, co je připojeno na druhé straně, zda ConnectOne modul, nebo cokoliv jiného, takže ho lze použít opravdu jako terminál.
Samozřejmě je možné na jeho základě budovat rozsáhlejší programy, třeba  různé klienty pro jednotlivé internetové protokoly využívající AT+i příkazů ConnectOne modulu.

Program používá subrutinu ECHO z WOZ Monitoru, jinak je na ROM nezávislý (ECHO je dlouhá tři instrukce, takkže se dá ke kódu Miniterminálu přidat a ten je pak na ROM zcela nezávislý).
program je možná zbytečně dlouhý, protože si při vysílání hlídá timeout – pokud zařízení na druhé straně ani po 65535 pokusech není na příjmu, data se zahodí a program pokračuje v interakci s uživatelem (nezasekne se), zahození dat (znaku) indikuje vypsáním znaku “#”.
Prográmek využívá (kromě INIT fáze a hlavní smyčky NEXTCHAR) dva podprográmky.
SEND_BYTE pošle znak v A na sériák. Pokud dojde k timeoutu, vrátí carry (Miniterminál sám to ale netestuje).
READ_BYTE načte do A znak ze sériáku. Pokud žádný k načtení není, vrací carry. Rutina na znak nečeká.
READ_BYTE by sice šel rozšířit na dvě rutiny (jednu, která vrací kód znaku hned a druhou, která na znak čeká a případně vytimeoutuje), ale v Miniterminálu to nebylo potřeba, tak jsem použil jen jednoduší verzi.
Syntaxe je přizpůsobena assembleru Krusader, který se na Apple I používá (a který je na Replice-1 TE v ROM od adresy F000). V něm si samozřejmě musíte zkrátit návěští na 6 znaků – například ACIA_DATA na AA_DAT, ACIA_SHAKE na AA_SHK, NEXTCHAR na NXCHAR a podobně.


ACIA_DATA  .= $C300
ACIA_SHAKE .= $C301
ACIA_PARITY .= $C302
ACIA_BAUDRATE .= $C303
ECHO       .= $FFEF            ;ROM routine for char output to screen

INIT       LDA #$1F            ;speed 19.200
           STA ACIA_BAUDRATE   ;set
           LDA #$0B            ;no parity
           STA ACIA_PARITY     ;set
NEXTCHAR   JSR READ_CHAR       ;Read character from serial.
           BCS SENDOUT         ;If any,
           JSR ECHO            ;display it
SENDOUT    LDA $D011           ;Load keyboard input status register.
           BPL NEXTCHAR        ;No key yet? Jump back and try again.
           LDA $D010           ;Read character from keyboard input register,
           JSR ECHO            ;display it,
           JSR SEND_BYTE       ;and send to serial.
           JMP NEXTCHAR

;reads byte in A. carry=empty
READ_BYTE  LDA ACIA_SHAKE      ;Character waiting for input?
           CMP #$08
           BEQ CHECK_READ      ;If no,
           SEC                 ;set carry and return.
           RTS
CHECK_READ LDA ACIA_DATA       ;If yes, read it,
           CLC                 ;clear carry and return.
           RTS

;sends byte in A, carry=timeout
SEND_BYTE  STA ACIA_DATA       ;Send byte out.
SEND_WAIT  LDX #$FF            ;65535 loops for timeout.
SEND_LOOP1 LDY #$FF   
SEND_LOOP2 LDA ACIA_SHAKE      ;Succesfully sent?
           AND #$10            ;If yes,
           CLC                 ;clear carry and go away.
           BNE SEND_OUT
           DEX ;sitting in his hexadecimal lair
           BNE SEND_LOOP2  
           DEX       
           BNE SEND_LOOP1      ;Loop until timeout,

           LDA “#”
           JSR ECHO            ;display error character,
           SEC                 ;set carry and go away.
SEND_OUT   RTS

P.S.
Neměl jsem v Doupěti dost času na otestování, takže si to zatím znalci 6502 assembleru můžou projít a hledat chyby.
Majitelé Replicy-1 a Multi I/O karty si můžou program ozkoušet na ostro a případnou nefunkčnost mi reportovat.

Dále, z nějakého důvodu mi smazali účet na Brielovu support fóru (takže zmizely i všechny mé předchozí příspěvky, což někdy vypadá dost kuriózně (zde zmizel můj zdroják KIM-DOSu a schémata připojení MMC2IEC k Micro-KIMu).
Proto jim tam tento zdroják, i když se jeho funkčnost ověří, nebudu moci postnout.