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

1.1       root        1:        org     $fa1000
                      2: 
                      3: GEMDOS_OPCODE          equ     8               ; Free op-code!
                      4: RUNOLDGEMDOS_OPCODE    equ     9               ; Free op-code!
                      5: VDI_OPCODE                     equ     12              ; Free op-code!
                      6: 
                      7: harddrive_boot dc.l    hdv_boot
                      8: old_gemdos             ds.l    1
                      9: vdi_opcode             dc.w    VDI_OPCODE              ;Address to call after Trap #2(VDI), causes illegal instruction
                     10: 
                     11: ;New GemDOS vector (0x84)
                     12: new_gemdos
                     13:        dc.w    GEMDOS_OPCODE   ; Returns NEG as run old vector, ZERO to return or OVERFLOW to run pexec
                     14:        bvs             pexec
                     15:        bne             go_oldgemdos
                     16:        rte
                     17: 
                     18: ;Branch to old GemDOS
                     19: go_oldgemdos
                     20:        dc.w    RUNOLDGEMDOS_OPCODE     ;Set PC to 'old_gemdos' and continue execution, WITHOUT corrupting register
                     21: 
                     22: ;Progam Execute
                     23: pexec
                     24:        lea             8(sp),a0
                     25:        btst    #5,(sp)
                     26:        bne.s   s_ok
                     27:        move.l  usp,a0
                     28:        addq    #2,a0
                     29: s_ok:
                     30:        tst             (a0)
                     31:        bne.s   no_0
                     32:        move.l  a6,-(sp)
                     33:        move.l  a0,a6
                     34:        move.l  a6,-(sp)        ;new
                     35:        bsr             find_prog
                     36:        move.l  (sp)+,a6        ;new
                     37:        bsr             pexec5
                     38:        bsr             reloc
                     39:        clr.l   2(a6)
                     40:        clr.l   10(a6)
                     41:        move.l  d0,6(a6)
                     42:        move    #4,(a6)                 ;6 for TOS 1.02 on
                     43:        move.l  (sp)+,a6
                     44:        bra             go_oldgemdos
                     45: no_0:
                     46:        cmp             #3,(a0)
                     47:        bne.s   go_oldgemdos
                     48:        move.l  a6,-(sp)
                     49:        move.l  a0,a6
                     50:        bsr             find_prog
                     51:        bsr             pexec5
                     52:        bsr             reloc
                     53: gohome:
                     54:        move.l  (sp)+,a6
                     55:        rte
                     56: find_prog:
                     57:        move    #$2f,-(sp)
                     58:        trap    #1
                     59:        addq    #2,sp
                     60:        move.l  d0,a0
                     61:        move.l  (a0)+,-(sp)
                     62:        move.l  (a0)+,-(sp)
                     63:        move.l  (a0)+,-(sp)
                     64:        move.l  (a0)+,-(sp)
                     65:        move.l  (a0)+,-(sp)
                     66:        move.l  (a0)+,-(sp)
                     67:        move.l  (a0)+,-(sp)
                     68:        move.l  (a0)+,-(sp)
                     69:        move.l  (a0)+,-(sp)
                     70:        move.l  (a0)+,-(sp)
                     71:        move.l  (a0)+,-(sp)
                     72:        move.l  a0,-(sp)
                     73:        move    #$17,-(sp)
                     74:        move.l  2(a6),-(sp)
                     75:        move    #$4e,-(sp)
                     76:        trap    #1
                     77:        addq    #8,sp
                     78:        move.l  (sp)+,a0
                     79:        move.l  (sp)+,-(a0)
                     80:        move.l  (sp)+,-(a0)
                     81:        move.l  (sp)+,-(a0)
                     82:        move.l  (sp)+,-(a0)
                     83:        move.l  (sp)+,-(a0)
                     84:        move.l  (sp)+,-(a0)
                     85:        move.l  (sp)+,-(a0)
                     86:        move.l  (sp)+,-(a0)
                     87:        move.l  (sp)+,-(a0)
                     88:        move.l  (sp)+,-(a0)
                     89:        move.l  (sp)+,-(a0)
                     90:        tst.l   d0
                     91:        beq.s   findprog_ok
                     92:        addq    #4,sp
                     93:        bra.s   gohome
                     94: findprog_ok:
                     95:        rts
                     96: pexec5:
                     97:        move.l  10(a6),-(sp)
                     98:        move.l  6(a6),-(sp)
                     99:        clr.l   -(sp)
                    100:        move    #5,-(sp)
                    101:        move    #$4b,-(sp)
                    102:        trap    #1
                    103:        lea             16(sp),sp
                    104:        tst.l   d0
                    105:        bmi.s   pexecerr
                    106:        rts
                    107: pexecerr:
                    108:        addq    #4,sp
                    109:        bra.s   gohome
                    110: reloc:
                    111:        movem.l a3-a5/d6-d7,-(sp)
                    112:        move.l  d0,a5
                    113:        clr             -(sp)
                    114:        move.l  2(a6),-(sp)
                    115:        move    #$3d,-(sp)
                    116:        trap    #1
                    117:        addq    #8,sp
                    118:        move.l  d0,d6
                    119:        move.l  a5,-(sp)
                    120:        add.l   #228,(sp)
                    121:        pea             $1c.w
                    122:        move    d6,-(sp)
                    123:        move    #$3f,-(sp)
                    124:        trap    #1
                    125:        lea             12(sp),sp
                    126: ; check size!!
                    127:        move.l  a5,-(sp)
                    128:        add.l   #256,(sp)
                    129:        pea             $7fffffff
                    130:        move    d6,-(sp)
                    131:        move    #$3f,-(sp)
                    132:        trap    #1
                    133:        lea             12(sp),sp
                    134:        move    d6,-(sp)
                    135:        move    #$3e,-(sp)
                    136:        trap    #1
                    137:        addq    #4,sp
                    138:        lea             8(a5),a4
                    139:        move.l  a5,d0
                    140:        add.l   #$100,d0
                    141:        move.l  d0,(a4)+                ; text start
                    142:        move.l  230(a5),d0
                    143:        move.l  d0,(a4)+                ; text length
                    144:        add.l   8(a5),d0                ; data start
                    145:        move.l  d0,(a4)+
                    146:        move.l  234(a5),(a4)+   ; data length
                    147:        add.l   234(a5),d0
                    148:        move.l  d0,(a4)+                ; bss start
                    149:        move.l  238(a5),(a4)+   ; bss length
                    150:        move.l  a5,d0
                    151:        add.l   #$80,d0
                    152:        move.l  d0,32(a5)
                    153:        move.l  24(a5),a4
                    154:        add.l   242(a5),a4              ; symbol table length
                    155:        move.l  8(a5),a3
                    156:        move.l  a3,d0
                    157:        tst.w   254(a5)
                    158:        bne.s   relocdone
                    159:        move.l  (a4)+,d7
                    160:        beq.s   relocdone
                    161:        add.l   d7,a3
                    162:        moveq   #0,d7
                    163: relloop0:
                    164:        add.l   d0,(a3)
                    165: relloop:
                    166:        move.b  (a4)+,d7
                    167:        beq.s   relocdone
                    168:        cmp.b   #1,d7
                    169:        bne.s   no254
                    170:        lea 254(a3),a3
                    171:        bra.s   relloop
                    172: no254:
                    173:        add.w   d7,a3
                    174:        bra.s   relloop0
                    175: relocdone:
                    176:        move.l  28(a5),d0
                    177:        beq.s   cleardone
                    178:        move.l  24(a5),a0
                    179: clear:
                    180:        clr.b   (a0)+
                    181:        subq.l  #1,d0
                    182:        bne.s   clear
                    183: cleardone:
                    184:        move.l  a5,d0
                    185:        movem.l (sp)+,a3-a5/d6-d7
                    186:        rts
                    187: 
                    188: ;Boot from floppy      
                    189: hdv_boot
                    190:        ;Read first sector of floppy
                    191:        ;Store at bodge TOS 1.00 address $167a
                    192:        ;And set D0.W to zero if executable
                    193:        
                    194:        movem.l d1-d7/a0-a6,-(sp)
                    195:        
                    196:        ;Read disc sector
                    197:        move.w  #0,-(sp)                        ;Drive A
                    198:        move.w  #0,-(sp)                        ;First logical sector
                    199:        move.w  #1,-(sp)                        ;Read 1 sector
                    200:        move.l  #$167a,-(sp)            ;Bodge address, $16da for TOS 1.02, $181C for 1.04, $185C for 1.62
                    201:        move.w  #0,-(sp)                        ;Read only
                    202:        move.w  #4,-(sp)
                    203:        trap    #13
                    204:        add.l   #14,sp
                    205:        tst.l   d0
                    206:        bmi             non_executable
                    207:        
                    208:        ;Is sector executable?
                    209:        ;It is if checksum is OK
                    210:        move.w  #$100,-(sp)                     ;256 words (512 bytes)
                    211:        move.l  #$167a,-(sp)            ;Address
                    212:        bsr             calc_bootsector_checksum
                    213:        addq.l  #6,sp
                    214:        cmp.w   #$1234,d0
                    215:        bne             non_executable
                    216:        
                    217:        clr.w   d0                                      ;Is executable
                    218:        movem.l (sp)+,d1-d7/a0-a6
                    219:        rts
                    220:        
                    221: non_executable
                    222:        moveq.l #4,d0                           ;Not valid boot sector
                    223:        movem.l (sp)+,d1-d7/a0-a6
                    224:        rts
                    225:        
                    226: ;Copied from ST Internals(Abacus), page 323
                    227: calc_bootsector_checksum
                    228:        link    a6,#0
                    229:        movem.l d6-d7,-(sp)
                    230:        clr.w   d7                                      ;Clear checksum
                    231:        bra             .loop_end                       ;To loop end
                    232: .loop
                    233:        move.l  8(a6),a0                        ;Address of buffer
                    234:        move.w  (a0),d0                         ;Get word
                    235:        add.w   d0,d7                           ;sum
                    236:        addq.l  #2,8(a6)                        ;Increment buffer address
                    237: .loop_end
                    238:        move.w  12(a6),d0                       ;Number of words
                    239:        subq.w  #1,12(a6)                       ;minus 1
                    240:        tst.w   d0                                      ;All words added?
                    241:        bne             .loop                           ;No
                    242:        move.w  d7,d0                           ;Result in D0
                    243: 
                    244:        tst.l   (a7)+
                    245:        movem.l (a7)+,d7
                    246:        unlk    a6
                    247:        rts
                    248:        

unix.superglobalmegacorp.com

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