jAsm

Diskussioner om programmering

Moderatorer: Fanta_gbg, e5frog, stonan, Zlasher, hollowman

Re: jAsm

Inläggav bjonte » 3 december 2015, 07:12

Nej, jag är bara nybörjare på språket och gör fel. Som tur är rättar assemblern mig. Det är en speciell känsla. Som att språket börjar leva när assemblern är bättre på språket än jag.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 3 december 2015, 07:16

Så fort det är tal om en array måste man ha krullparenteser. Det gäller även när man definierar en sträng i minnet.

Kod: Markera allt
define byte[] s = { "hej" }
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav TBC » 3 december 2015, 15:43

Ok, en fundering: Jag använder sjasm för att programmera Z80, där finns det en funktion för moduler.
Det fungerar så här:

Kod: Markera allt
   module sprites
init:
   ret
   endmodule

För att hänvisa till en label i en annan modul skriver man t ex:
Kod: Markera allt
   CALL sprites.init

Det tycker jag är snyggt, det blir liksom objektorienterat.
Användarvisningsbild
TBC
Erfaren mästare
Erfaren mästare
 
Inlägg: 304
Blev medlem: 4 september 2008, 16:44

jAsm

Inläggav bjonte » 3 december 2015, 16:45

Jag håller med. I jAsm är tanken att namnspaces löser detta.

Kod: Markera allt
namespace sprites
{
  init:
    rts
}

jsr sprites::init
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 3 december 2015, 16:47

Gör modulkonceptet något annat än att sätta ett gruppnamn på labels?
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav TBC » 3 december 2015, 21:15

Nä, jag tror inte det.
Användarvisningsbild
TBC
Erfaren mästare
Erfaren mästare
 
Inlägg: 304
Blev medlem: 4 september 2008, 16:44

Re: jAsm

Inläggav bjonte » 5 december 2015, 09:02

Jag är nog halvvägs igenom portningen av Bruce Lee II nu. Det är ett rätt så tråkigt jobb. Det här unnamed-nyckelordet måste nog bort. Det är för drygt att ha med i koden. Anledningen till att det finns är att i fallet med reserve är det inte tydligt för parsern när uttrycket slutar. Se här:
Kod: Markera allt
reserve byte
a(2+2)

Det här skulle kunna tolkas som:
1) en anonym reserverad byte och ett funktionsanrop
2) en reserverad byte som heter 'a' och ett uttryck inom parenteser som resulterar i 4 (och som kastas bort)

Så för att lösa detta behövs antingen ett alternativt nyckelord för namnlösa reserveringar eller så måste ett semikolon krävas för att avsluta en anonym reservering. Just nu lutar jag åt att kräva ett semikolon. Jag tar gärna emot förslag eller kommenterar på detta.

Definieringen är ett mindre problem. Den har bara ärvt samma unnamed-syntax för att det ska vara likt reserve. Där finns det ju alltid ett likhetstecken som entydigt kommer att visa om det finns ett namn eller inte innan.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 13 december 2015, 12:20

Portningen av Bruce Lee II går långsamt. Jag upptäcker små fel både hos DAsm och jAsm under tiden. Ibland dyker det också upp ett och annat feltänk från min sida. Jag har brottats med ett problem nyligen som har krävt att jag ändrat på språket. Ett fall som uppkom i BL2 var att lokala konstanter var definierade inuti en if-sats och användes utanför if-satsen. Detta är tillåtet i DAsm för det enda som begränsar livslängden är subroutine-nyckelordet. Här är ett exempel i DAsm-syntax (förutom indenteringen).

Kod: Markera allt
subroutine
do_something:
   lda #1
   sta .self_modify_addr

   if (FEATURE_IS_ON)
      .self_modify_addr = * + 1
      lda #0
   else
      nop
      .self_modify_addr = * + 1
      lda #0
   endif
   rts


Detta skulle direktöversättas såhär till jAsm.

Kod: Markera allt
subroutine do_something
{
   lda #1
   sta .self_modify_addr

   if (FEATURE_IS_ON) {
      const .self_modify_addr = * + 1
      lda #0
   } else {
      nop
      const .self_modify_addr = * + 1
      lda #0
   }
   rts
}


Problemet som uppstår är att den lokala konstanten inte går att komma åt utanför den rymd den är skapad i. Så det blir ett felmeddelande vid sta-instruktionen som säger att variabeln inte är definierad.

Jag satt länge och funderade på hur det här fallet ska stödjas. I stora drag så handlar det om att stödja eller inte stödja. Om det inte ska stödjas så måste någon annan konstruktion ändå finnas som gör det enkelt att utföra det här. Det skulle gå att skapa en namnrymd i subrutiner och istället använda globala konstanter. Variabler går också att använda men det öppnar för fler felmöjligheter för programmeraren.

Jag beslöt att införa fördeklarerade lokala konstanter. Med hjälp av fördeklarering så kan man placera konstanten i en yttre rymd utan att veta vad värdet är än. En konstant kan bara tilldelas en gång så det är fortfarande en konstant, det är bara tilldelningen och skapandeplatsen som har separerats. Lösningen ser ut såhär.

Kod: Markera allt
subroutine do_something
{
   const .self_modify_addr

   lda #1
   sta .self_modify_addr

   if (FEATURE_IS_ON) {
      .self_modify_addr = * + 1
      lda #0
   } else {
      nop
      .self_modify_addr = * + 1
      lda #0
   }
   rts
}


Nu finns det ju faktiskt två tilldelningar här och det var ju inte tillåtet, men det händer inte här eftersom bara en av if-satsens delar kommer att existera vid ett givet tillfälle.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 17 december 2015, 16:04

Jag sitter nu med en allvarlig lus som orsakar indeterminism i assemblerpassen. Det resulterar i att variabler och konstanter inte har avstannat, eller nått jämvikt kan man säga, när sista passet körs. Det är skumt och svårdebuggat eftersom det inte verkar gå att reproducera på små program. Jag ska bygga in symboldump för att underlätta letandet.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav Redreamer » 17 december 2015, 19:47

Att du ens orkar tänkte jag skriva men inser att det är sådant som en programmerare nästan i hemlighet älskar, att hitta en svår nöt å känna YESS! fan vad grym jag var! Eller så kör man min version, fan, vad dum jag var som inte insåg det , hehe.
Försöker läsa och hänga med i din tråd men eftersom jag inte har någon som helst erfarenhet av dassm eller macros på detta vis så har jag svårt att direkt se helheten i detta. Men jag ska sätta mig in i det lite mer till mitt nästa projekt. Om jag nu kommer så långt :D

Fortsatt lycka till iaf!
It always return one day!
Användarvisningsbild
Redreamer
Stormästare
Stormästare
 
Inlägg: 1249
Blev medlem: 1 maj 2005, 10:07
Ort: Borås

Re: jAsm

Inläggav bjonte » 20 december 2015, 21:35

Nu har jag hittat problemet. Variabelekvationen löste sig inte kan man säga. Systemet hamnade i självsvängning så assemblern gav upp att leta efter ett stabilt tillstånd efter ett tjugotal pass. Jag har en lösning på detta som jag ska bygga in i dagarna. Jag har nu lyckats få Bruce Lee II-huvudprogrammet igenom assemblern. Det är inte binärkompatibelt än för jag har gjort några misstag i konverteringen. Jag ska jobba med det också tills det är identiskt med referensbinären.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 22 december 2015, 20:19

Nu har jag fått BL2-huvudprogrammet att bli binärkompatibelt med DAsms output. Det är en milstolpe! Assemblern tål nu en rejäl bunt med källkod utan att baxna. Den verkar lite långsammare än jag hade hoppats men det är helt ok tror jag. Det tog 1.2 s att bygga huvudprogrammet på min sunkiga Eee PC. Med lite optimeringar på det och en bättre dator ska det nog krypa ner under en sekund.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav TBC » 22 december 2015, 21:52

Hur snabb är Dasm då?
Användarvisningsbild
TBC
Erfaren mästare
Erfaren mästare
 
Inlägg: 304
Blev medlem: 4 september 2008, 16:44

Re: jAsm

Inläggav bjonte » 22 december 2015, 22:28

Jag kan inte få det att kompilera i Linux så jag kan inte jämföra med de här mätningarna. Jag måste köra i Windows först.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

Re: jAsm

Inläggav bjonte » 23 december 2015, 08:01

Nu har jag gjort en jämförelse i Windows på en snabbare maskin (3.5 GHz i7). Det tar 260 ms att bygga i DAsm och 120 ms att bygga i jAsm. Det är inte fullständigt rättvist för DAsm skriver en symboltabell också, men det kommer inte att ta dubbelt så lång tid att bygga en sådan med.
Användarvisningsbild
bjonte
Stormästare
Stormästare
 
Inlägg: 1673
Blev medlem: 17 april 2006, 23:12

FöregåendeNästa

Återgå till Programmering/prog.-verktyg

Vilka är online

Användare som besöker denna kategori: Inga registrerade användare och 1 gäst

Banners

BOA Japon Mediapalatset Nostalgibutiken
Quartex Retro Overlays Retroplay Spel och sånt
Super Motaro Söders Serie & Skivhandel vintagegames.se RG 2016
cron