ASMSMAN.TXT 890112 Z80-assemblern ASMS. =================== Detta {r att assemblerprogram f|r ABC80 med 32K RAM och floppy. ASMS har vissa speciella f|rdelar j{mf|rt med en vanlig textassembler. Eftersom opkoder etc tolkats redan i texteditorn blir assembleringen snabbare. Alla LABELS lagras i en hash-kodad tabell, vilket snabbar upp s|ktider. Utfilen kan vara antingen en .ABS fil, eller en .BAC fil - i s} fall lagras koden i ett ASSTRAN-liknande format. Man kan assemblera flera filer i kedja, som d} kallas (t.ex.) K[LLKOD1.S K[LLKOD2.S K[LLKOD3.S etc. assemblern slutar assemblera f|rst n{r END p}tr{ffats. P} s} vis kan man assemblera i princip hur l}nga filer som helst, men vid ungef{r 24K assemblerad kod b|rjar antagligen symboltabellen bli full... START AV ASMS ============= Man skriver helt enkelt RUN ASMS, eller ocks} kan man fr}n ASMED skriva kommandot ASM. FILSPECIFICERING TILL ASMS ========================== Vid 'input file' anger man infil. Observera att man ENDAST kan assemblera filer som genererats av ASMED. Vill man assemblera en textfil, m}ste man ladda in den i ASMED, och sedan spara med SAVE. F|ljande alternativ finns: 1) FILNAMN.EXT Assemblering av en fil. (extensionen {r oftast .S). 2) FILNAMN Assemblering av flera filer. Assemblern assemblerar f|rst FILNAMN1.S, sedan FILNAMN2.S, osv tills att END p}tr{ffas i n}gon fil. Vid 'output file' anger man ut-(objekt- kods-) fil. Om ingen extension anges, s{tts den till default extension (.BAC eller .ABS). Om inget filnamn anges, f}r utfilen samma filnamn som infilen plus default utfilsextension. D{refter v{ljs typ av utfil. .ABS k|rs under DOS, medan .BAC kan k|ras som ett vanligt BASIC-program (a la ASSTRAN). Vid 'err file' kan man ange om man vill att fel och andra meddelanden fr}n assemblern skall hamna p} fil, t ex PR:. I vilket fall som helst hamnar de p} sk{rmen. Man kan i denna version varken f} en assembleringslista eller utskrift av symboltabellen, men det kommer kanske i framtiden... OPKODER ======= Alla opkoder {r helt standard Z80 opkoder. Dessutom tar assemblern naturligtvis de vanliga pseudo-opsen: ORG nnnn Startadress f|r programmet. Obs att ORG kan specificeras hur m}nga g}nger som helst, om olika programsegment ligger i helt skilda delar av minnet. Se ocks} ADR nedan. DEFB n DEFine Byte (som vanligt). DEFW nn DEFine Word (som vanligt). DEFS nn DEFine Space (som vanligt). DEFM "xxx" DEFine Memory (som vanligt). EQU Definierar lablar (som vanligt). END Slut p} assembleringen. Obs att man vid assemblering av flera filer endast f}r s{tta END i den sista. Dessutom finns f|ljande pseudo-ops, som {r specifika f|r ASMED/ASMS: GO nnnn S{tter uppstartadressen. Obs! att om GO inte speci- ficeras kommer programmet att startas upp p} adress 0, dvs. =RESET! Om man inte vill ha uppstart, skriver man GO 326. (PEEK(326)=201=RET i ABC80) DEFB n,n,n DEFB och DEFW kan ta mer DEFS n,n,n {n ett argument (som POKE) DEFM "xxx"* Om man s{tter * efter en DEFM-sats, blir sista tecknet OR 128. ZGEN,GEN St{nger av, resp s{tter p} kodgenereringen - praktiskt vid generering av system- variabler mha DEFB och DEFW. (Vid ZGEN uppdateras ADR- och l{gespekarna, men ingen objektkod genereras.) BLK xxx Man kan dela in programmet i BLOCKS (BLKs) - man kan ha samma label i olika block utan att de p}verkar varandra - bra vid stora program sammansatta av mindre, relativt oberoende program. Se ex 1 nedan f|r anv{ndn. ADR nnnn Den adress d{r koden l{ggs {r inte n|dv{ndigtvis den som anges i ORG, utan anges separat i en ADR sats. Normalt skriver man ADR $, direkt efter ORG, dvs programmet l{ggs p} "r{tt" adress. Om man gl|mmer ADR kan objektkoden hamna var som helst! = EQU {r ekvivalent med =. MATEMATIKEN I ASMS ================== Uttrycken evalueras som i ABC80's heltalsaritmetik. F|ljande matematiska operationer finns: +,-,*,/,.and.,.or.,.xor. (i prioritets- ordning). + och - har samma prioritet, liksom * och / resp. .or. och .xor. + och - har ocks} un{r funktion, som t.ex. i talen +34 och -04C5h. Det finns ocks} n}gra funktioner: abs(n) dvs ABS(N) hi(n) hi-byte av n (SWAP%(N) AND 255) lo(n) lo-byte av n (N AND 255) swap(n) SWAP%(N) En matematisk konstant kan vara a) ett tal i decimal (4324 el 4324d) form, hexadecimal (07C5h) form eller bin{r (11011b) form. b) $ ,dvs PC's (current address) v{rde. c) en str{ngkonstant, t.ex. "e". Obs att str{ngkonstanten "AB" har v{rdet ASC("A")+ASC("B")*256. EXEMPEL P] NYMODIGHETERNA I ASMS ================================ Ex 1. BLK: F|ljande programsnutt: blk OLLE$ ALFA = 10 BETA = 20 defb ALFA,BETA,LISA$:ALFA blk LISA$ ALFA = 30 BETA = 40 defb ALFA,BETA,OLLE$:ALFA kommer att resultera i att f|ljande kod produceras: 10,20,30 (f|rsta defb-satsen) 30,40,10 (andra defb-satsen) Om man inte namnger f|rsta blocket i ett program (dvs det finns lablar innan f|rsta blk-satsen) f}r dessa automatiskt blocknamnet MAIN$. Namnet MAIN$ kan d{rf|r inte anv{ndas f|r egna blocknamn. Ex 2. ADR och ORG Exempel p} normal start av program: org 65408 adr $ go START programmet assembleras till adress 65408 och l{ggs ocks} p} denna adress vid inladdning. Efter inladdningen startas programmet up mha den rutin som finns vid l{get START. Om man vill ha }terhopp till BASIC fr}n denna rutin avslutas den med RET. ]terhopp fr}n en .ABS fil brukar vara JP 0C103h (}terstart av CMDINT via * READY * men utan startup- text). I vissa fall kan man vilja assemblera en kod som INTE skall l{ggas p} den ORGade adressen (i mera avancerade program som sj{lva genererar program etc.): org 52000 adr $ ; START ld hl,HERE ; h{r finns ld bc,LEN ; huvudprogrammet ld de,ANNAN ldir . . . HERE org 65408 ; vi antar att ANNAN ld hl,OLLE ; denna program- ld a,(65060) ; snutt placeras and a ; i minnet av jp p,KALAS ; huvudprogrammet dec a ; men ligger i jr z,BEATA ; objektkoden call 2 ; precis efter cp 'A' ; huvudprogrammet . . Ex 3. GEN och ZGEN H{r {r ett exempel p} en massa system- variabler till ett program. Dessa genereras enklast med ZGEN och DEFB/ DEFW. org 60000 zgen ; sl} av kod- ; genereringen. ; Systemvariablerna ; genereras ju av ; programmet n{r det ; k|r. VAR1 defw 0 ; N}gra sysvars... VAR2 defb 0 . . gen ; sl} p} kod- ; genereringen ; ; org 53240 adr $ ; START ld hl,EVERT ; sj{lva ld de,KORV ; programmet . . FELMEDDELANDEN ============== ASMS ger eventuella felmeddelanden i kortfattad klartext. Om man har specificerat en 'err file' hamnar fel- utskrifterna p} denna oxo. F|ljande fel kan uppst}: Bad opcode Fel argument till opkod. T.ex. LD DE,BC. Num o/flo F|r stort tal eller 1/0. Bad expr Felaktigt uttryck. Lbl n/found Labeln {r inte definierad. Bad lblname Felaktigt labelnamn. Bad range Felaktigt omr}de f|r argument. T.ex. LD A,(IX+2553) i JR $+1000. Lbl n/unique Samma label definierad mer {n en g}ng. Too much text \verfl|dig text p} raden t.ex. fler argument {n vad opkoden kr{ver. N/enough text F|r lite text p} raden. T.ex. ADD A. No label Ingen label i EQU sats. Symtab full Guess what! BREAK Om man trycker ctrl-c avbryts assembleringen. Alla felmeddelanden anges med radnummer s} att man kan r{tta dem med ASMED. Observera att ett fel ofta ger upphov till flera andra, t.ex. kan ett 'Bad expr' i en EQU-sats ge upphov till ett dussintal 'Lbl n/found'. Mycket n|je! /Ricard Wolf <7554> Bellevuev{gen 53 216 19 Malm|