Bo Larsson
<5630>
· Text 277 · w8 · kommentar
1985-07-27 14:19
Ärende: Att programmera portarna i cp/m
Att det inte finns något generelt sätt att programera cpm' s
dataportar är ju ganska givet men att använda dom på ett generelt
sätt i program fungerar ju.
I Xmodem får man i källkoden manuellt ange vad sina portar har
för nummer och även skriva rutiner som initierar sina
modemportar. De enda portar man inte behöver ange är dom som har
med consolen att göra, de initeras automatiskt enligt rutiner som
jag senare ger exempel på.
Bra exempel på program som använder alla portarna (även modem) på
ett generelt sätt är just PIP och den generella varianten på
Kermit.
I cp/m's Bios (system-beroende) måste man ange vad portarna till
sin dator har för nummer och hur dom maskas. För att man sedan
skall kunna använda den informationen måste det finnas ett pek
till dom rutiner som använder dessa data.
För att klara detta startar Bios'en men en hopp-tabell till dessa
rutiner, rutinerna i den tabellen måste komma i en speciell
ordning som är standard i cp/m. Saknar man en rutin i sitt system
måste det i alla fall finnas ett virituellt hopp till denna rutin
som endast innehåller ett RET.
De rutiner som är intressanta här är rutinerna 2 -> 7 i tabellen:
BIOS: jp wboot ; varm-boot (Bios+ 0)
-> jp const ; console status (Bios+ 3)
-> jp conin ; console input (Bios+ 6)
-> jp conout ; console output (Bios+ 9)
-> jp list ; list output (Bios+12)
-> jp punch ; punch dev. (Bios+15)
-> jp reader ; reader dev. (Bios+18)
Bios'en ligga på olika ställen beroende på minnesstorlek och
dator men det är inget man behöver tänka på, peket till själva
Bios'en ligger alltid på adress 0001h.
Adress 0000h innehåller en hopppinstruktion, så ett hopp till
adress 0000h gör alltså ett hopp till Bios'en som direkt går till
en varmboot-rutin.
För att initiera egna rutiner som använder ovanstånde kan man
göra följande:
INITADRS: ld hl,(0001) ; hitta bios-adressen
ld de,3 ; öka med 3
add hl,de ; (skippa varmboot)
ld (STAT+1),hl ; spara const-adr
add hl,de
ld (CONI+1),hl ; spara conin-adr
add hl,de
ld (CONO+1),hl ; spara conout-adr
add hl,de
ld (LST+1),hl ; spara list-adr
add hl,de
ld (PUN+1),hl ; spara punch-adr
add hl,de
ld (RDR+1),hl ; spara reader-adr
ret
; Kontrol av console-status anropar denna rutin och återvänder
; med A=0ffh om console ready, A=00h om not ready.
VSTAT: push BC ! push DE ! push HL
STAT: jp ¤-¤
pop HL ! pop DE ! pop BC
ret
; Denna rutin gör console-input och återvänder med tecken i A.
VCONI: push BC ! push DE ! push HL
CONI: jp ¤-¤
pop HL ! pop DE ! pop BC
ret
; Denna rutin gör console-output, ingång är output-tecken i A.
VCONO: push AF ! push BC ! push DE ! push HL
ld c,a
CONO: jp ¤-¤
pop HL ! pop DE ! pop BC ! pop AF
ret
; Denna rutin gör lst-output, ingång är output-tecken i A.
VLST: push AF ! push BC ! push DE ! push HL
ld c,a
LST: jp ¤-¤
pop HL ! pop DE ! pop BC ! pop AF
ret
; Denna rutin gör pun-output, ingång är output-tecken i A.
VPUN: push AF ! push BC ! push DE ! push HL
ld c,a
PUN: jp ¤-¤
pop HL ! pop DE ! pop BC ! pop AF
ret
; Denna rutin gör rdr-input och återvänder med tecken i A.
VRDR: push BC ! push DE ! push HL
RDR: jp ¤-¤
pop HL ! pop DE ! pop BC
ret
mhv Bosse Larsson