Annotation of hatari/src/cart_asm.s, revision 1.1.1.3

1.1.1.3 ! root        1: ; 68000 code that is used for starting programs from the emulated GEMDOS harddisk
        !             2: 
        !             3: 
1.1       root        4:        org     $fa1000
                      5: 
                      6: GEMDOS_OPCODE          equ     8               ; Free op-code!
                      7: VDI_OPCODE                     equ     12              ; Free op-code!
                      8: 
1.1.1.3 ! root        9: 
        !            10: harddrive_boot:        dc.l    0                       ; unused
        !            11: old_gemdos:            ds.l    1
        !            12: vdi_opcode:            dc.w    VDI_OPCODE      ; Address to call after Trap #2(VDI), causes illegal instruction
1.1       root       13: 
                     14: ;New GemDOS vector (0x84)
1.1.1.3 ! root       15: new_gemdos:
1.1       root       16:        dc.w    GEMDOS_OPCODE   ; Returns NEG as run old vector, ZERO to return or OVERFLOW to run pexec
1.1.1.3 ! root       17:        bvs.s   pexec
        !            18:        bne.s   go_oldgemdos
1.1       root       19:        rte
                     20: 
                     21: ;Branch to old GemDOS
1.1.1.3 ! root       22: go_oldgemdos:
        !            23:        move.l  old_gemdos(pc),-(sp)    ;Set PC to 'old_gemdos' and continue execution, WITHOUT corrupting registers!
        !            24:        rts
1.1       root       25: 
                     26: ;Progam Execute
1.1.1.3 ! root       27: pexec:
1.1       root       28:        lea             8(sp),a0
                     29:        btst    #5,(sp)
                     30:        bne.s   s_ok
                     31:        move.l  usp,a0
                     32:        addq    #2,a0
                     33: s_ok:
1.1.1.3 ! root       34:        tst             (a0)            ; Test pexec mode
1.1       root       35:        bne.s   no_0
1.1.1.3 ! root       36: 
        !            37:        ; Simulate pexec mode 0
1.1       root       38:        move.l  a6,-(sp)
                     39:        move.l  a0,a6
                     40:        move.l  a6,-(sp)        ;new
1.1.1.3 ! root       41:        bsr.s   find_prog
1.1       root       42:        move.l  (sp)+,a6        ;new
                     43:        bsr             pexec5
                     44:        bsr             reloc
                     45:        clr.l   2(a6)
                     46:        clr.l   10(a6)
                     47:        move.l  d0,6(a6)
1.1.1.3 ! root       48: 
        !            49:        move.w  #48,-(sp)       ; Sversion: get GEMDOS version
        !            50:        trap    #1                      ; call GEMDOS
        !            51:        addq    #2,sp
        !            52:        ror.w   #8,d0           ; Major version to high, minor version to low byte
        !            53:        cmp.w   #$0015,d0
        !            54:        bge.s   use_gemdos_015
        !            55:        move.w  #4,(a6)         ; pexec mode 4 for exec. prepared program
        !            56:        bra.s   mode0_ok
        !            57: use_gemdos_015:
        !            58:        move.w  #6,(a6)         ; On GEMDOS 0.15 and higher, we can use mode 6
        !            59: mode0_ok:
        !            60: 
1.1       root       61:        move.l  (sp)+,a6
1.1.1.3 ! root       62:        bra.s   go_oldgemdos
        !            63: 
1.1       root       64: no_0:
                     65:        cmp             #3,(a0)
                     66:        bne.s   go_oldgemdos
1.1.1.3 ! root       67: 
        !            68:        ; Simulate pexec mode 3
1.1       root       69:        move.l  a6,-(sp)
                     70:        move.l  a0,a6
1.1.1.3 ! root       71:        bsr.s   find_prog
        !            72:        bsr.s   pexec5
        !            73:        bsr.s   reloc
1.1       root       74: gohome:
                     75:        move.l  (sp)+,a6
                     76:        rte
1.1.1.3 ! root       77: 
1.1       root       78: find_prog:
1.1.1.3 ! root       79:        move    #$2f,-(sp)      ; Fgetdta
1.1.1.2   root       80:        trap    #1              ; Gemdos
1.1       root       81:        addq    #2,sp
                     82:        move.l  d0,a0
                     83:        move.l  (a0)+,-(sp)
                     84:        move.l  (a0)+,-(sp)
                     85:        move.l  (a0)+,-(sp)
                     86:        move.l  (a0)+,-(sp)
                     87:        move.l  (a0)+,-(sp)
                     88:        move.l  (a0)+,-(sp)
                     89:        move.l  (a0)+,-(sp)
                     90:        move.l  (a0)+,-(sp)
                     91:        move.l  (a0)+,-(sp)
                     92:        move.l  (a0)+,-(sp)
                     93:        move.l  (a0)+,-(sp)
                     94:        move.l  a0,-(sp)
                     95:        move    #$17,-(sp)
                     96:        move.l  2(a6),-(sp)
1.1.1.3 ! root       97:        move    #$4e,-(sp)      ; Fsfirst
1.1.1.2   root       98:        trap    #1              ; Gemdos
1.1       root       99:        addq    #8,sp
                    100:        move.l  (sp)+,a0
                    101:        move.l  (sp)+,-(a0)
                    102:        move.l  (sp)+,-(a0)
                    103:        move.l  (sp)+,-(a0)
                    104:        move.l  (sp)+,-(a0)
                    105:        move.l  (sp)+,-(a0)
                    106:        move.l  (sp)+,-(a0)
                    107:        move.l  (sp)+,-(a0)
                    108:        move.l  (sp)+,-(a0)
                    109:        move.l  (sp)+,-(a0)
                    110:        move.l  (sp)+,-(a0)
                    111:        move.l  (sp)+,-(a0)
                    112:        tst.l   d0
                    113:        beq.s   findprog_ok
                    114:        addq    #4,sp
                    115:        bra.s   gohome
                    116: findprog_ok:
                    117:        rts
1.1.1.3 ! root      118: 
1.1       root      119: pexec5:
                    120:        move.l  10(a6),-(sp)
                    121:        move.l  6(a6),-(sp)
                    122:        clr.l   -(sp)
                    123:        move    #5,-(sp)
1.1.1.3 ! root      124:        move    #$4b,-(sp)      ; Pexec
1.1.1.2   root      125:        trap    #1              ; Gemdos
1.1       root      126:        lea             16(sp),sp
                    127:        tst.l   d0
                    128:        bmi.s   pexecerr
                    129:        rts
                    130: pexecerr:
                    131:        addq    #4,sp
                    132:        bra.s   gohome
1.1.1.3 ! root      133: 
1.1       root      134: reloc:
                    135:        movem.l a3-a5/d6-d7,-(sp)
                    136:        move.l  d0,a5
                    137:        clr             -(sp)
                    138:        move.l  2(a6),-(sp)
1.1.1.3 ! root      139:        move    #$3d,-(sp)      ; Fopen
1.1.1.2   root      140:        trap    #1              ; Gemdos
1.1       root      141:        addq    #8,sp
                    142:        move.l  d0,d6
                    143:        move.l  a5,-(sp)
                    144:        add.l   #228,(sp)
                    145:        pea             $1c.w
                    146:        move    d6,-(sp)
1.1.1.3 ! root      147:        move    #$3f,-(sp)      ; Fread
1.1.1.2   root      148:        trap    #1              ; Gemdos
1.1       root      149:        lea             12(sp),sp
                    150: ; check size!!
                    151:        move.l  a5,-(sp)
                    152:        add.l   #256,(sp)
                    153:        pea             $7fffffff
                    154:        move    d6,-(sp)
1.1.1.3 ! root      155:        move    #$3f,-(sp)      ; Fread
1.1.1.2   root      156:        trap    #1              ; Gemdos
1.1       root      157:        lea             12(sp),sp
                    158:        move    d6,-(sp)
1.1.1.3 ! root      159:        move    #$3e,-(sp)      ; Fclose
1.1.1.2   root      160:        trap    #1              ; Gemdos
1.1       root      161:        addq    #4,sp
                    162:        lea             8(a5),a4
                    163:        move.l  a5,d0
                    164:        add.l   #$100,d0
                    165:        move.l  d0,(a4)+                ; text start
                    166:        move.l  230(a5),d0
                    167:        move.l  d0,(a4)+                ; text length
                    168:        add.l   8(a5),d0                ; data start
                    169:        move.l  d0,(a4)+
                    170:        move.l  234(a5),(a4)+   ; data length
                    171:        add.l   234(a5),d0
                    172:        move.l  d0,(a4)+                ; bss start
                    173:        move.l  238(a5),(a4)+   ; bss length
                    174:        move.l  a5,d0
                    175:        add.l   #$80,d0
                    176:        move.l  d0,32(a5)
                    177:        move.l  24(a5),a4
                    178:        add.l   242(a5),a4              ; symbol table length
                    179:        move.l  8(a5),a3
                    180:        move.l  a3,d0
                    181:        tst.w   254(a5)
                    182:        bne.s   relocdone
1.1.1.2   root      183: 
1.1.1.3 ! root      184:        ; Get first offset of the relocation table. Since A4 seems sometimes not
        !           185:        ; to be word aligned (if symbol table length is uneven), we have to read
        !           186:        ; byte by byte...
        !           187:        move.b  (a4),d7
        !           188:        clr.b   (a4)+
        !           189:        lsl.w   #8,d7
        !           190:        move.b  (a4),d7
        !           191:        clr.b   (a4)+
        !           192:        swap    d7
        !           193:        move.b  (a4),d7
        !           194:        clr.b   (a4)+
        !           195:        lsl.w   #8,d7
        !           196:        move.b  (a4),d7
        !           197:        clr.b   (a4)+
        !           198: 
        !           199:        tst.l   d7
1.1       root      200:        beq.s   relocdone
1.1.1.2   root      201:        adda.l  d7,a3
1.1.1.3 ! root      202:        moveq   #0,d7
        !           203: relloop0:
        !           204:        add.l   d0,(a3)
        !           205: relloop:
        !           206:        move.b  (a4),d7
        !           207:        move.b  #$00,(a4)+              ; Some programs like GFA-Basic expect a clear memory
        !           208:        tst.b   d7
        !           209:        beq.s   relocdone
        !           210:        cmp.b   #1,d7
        !           211:        bne.s   no254
        !           212:        lea     254(a3),a3
        !           213:        bra.s   relloop
        !           214: no254:
        !           215:        adda.w  d7,a3
        !           216:        bra.s   relloop0
1.1.1.2   root      217: 
1.1       root      218: relocdone:
                    219:        move.l  28(a5),d0
                    220:        beq.s   cleardone
                    221:        move.l  24(a5),a0
                    222: clear:
                    223:        clr.b   (a0)+
                    224:        subq.l  #1,d0
                    225:        bne.s   clear
                    226: cleardone:
                    227:        move.l  a5,d0
                    228:        movem.l (sp)+,a3-a5/d6-d7
                    229:        rts

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.