[Antique-Hackers] Första titt på ~90% komplett kompilering

John Lorentzson duuqnd at stacken.kth.se
Thu Jul 3 17:06:28 CEST 2025


Jag har skrivit klart bitarna som behövs för att kompilera ett ganska 
begränsat program från källkod till en maskinkod i bytesekvensform. Det 
saknas fortfarande en del kompileringsmetoder, specifikt för aritmetik 
och jämförelser, men + och == fungerar. Dessutom vet kompilatorn inget 
om vilka funktioner som finns i assemblyvärlden, så alla adresser har 
temporärt satts till 0xFEC0. Ett exempel följer:

for x do 16 times
     if x == 5 then
        drawline(0, 0, 10, 10)
        if y == 1 then
            set_background(4)
        else
            set_background(0)
        end
        y = 1
     else
        set_background(0)
        drawline(100, 100, 120, 120)
     end
end

...kompilerades till en sekvens med bytes som disassemblas till:

C000   A9 00                LDA #$00
C002   85 08                STA $08
C004   A5 08      LC004     LDA $08
C006   C9 05                CMP #$05
C008   D0 2D                BNE LC037
C00A   A9 00                LDA #$00
C00C   85 00                STA $00
C00E   85 01                STA $01
C010   A9 0A                LDA #$0A
C012   85 02                STA $02
C014   85 03                STA $03
C016   20 C0 FE             JSR $FEC0
C019   A5 09                LDA $09
C01B   C9 01                CMP #$01
C01D   D0 0A                BNE LC029
C01F   A9 04                LDA #$04
C021   85 00                STA $00
C023   20 C0 FE             JSR $FEC0
C026   4C 30 C0             JMP LC030
C029   A9 00      LC029     LDA #$00
C02B   85 00                STA $00
C02D   20 C0 FE             JSR $FEC0
C030   A9 01      LC030     LDA #$01
C032   85 09                STA $09
C034   4C 4D C0             JMP LC04D
C037   A9 00      LC037     LDA #$00
C039   85 00                STA $00
C03B   20 C0 FE             JSR $FEC0
C03E   A9 64                LDA #$64
C040   85 00                STA $00
C042   85 01                STA $01
C044   A9 78                LDA #$78
C046   85 02                STA $02
C048   85 03                STA $03
C04A   20 C0 FE             JSR $FEC0
C04D   A5 08      LC04D     LDA $08
C04F   18                   CLC
C050   69 01                ADC #$01
C052   85 08                STA $08
C054   C9 10                CMP #$10
C056   D0 AC                BNE LC004
C058   60                   RTS

Notera att den STA $08: LDA $08 biten som finns vid adress C002 faktiskt 
behövs eftersom LDA-instruktionen hoppas till senare, och då kan värdet 
ha ändrats. Om några fel hittas, svara gärna med dem!

-duuq-


More information about the Antique-Hackers mailing list