Annotation of hatari/src/cart_asm.s, revision 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.