📄 old.asm
字号:
is_mp3_file: mov a, filename+0 jz isfile_no add a, #256 - 0xE5 jz isfile_no mov a, attrib jb acc.1, isfile_no ;ATTR_HIDDEN jb acc.2, isfile_no ;ATTR_SYSTEM jb acc.3, isfile_no ;ATTR_VOLUME_ID jb acc.4, isfile_no ;ATTR_DIRECTORY mov a, filename+8 cjne a, #'M', isfile_no mov a, filename+9 cjne a, #'P', isfile_no mov a, filename+10 cjne a, #'3', isfile_no setb c retisfile_no: clr c ret ;print the filename, attrib, first cluster, and file sizeprint_filename: mov r0, #filenamepfn1: mov a, @r0 lcall cout inc r0 cjne r0, #filename+8, pfn1 mov a, #'.' lcall coutpfn2: mov a, @r0 lcall cout inc r0 cjne r0, #filename+11, pfn2 mov dptr, #mesg_attrib lcall pstr mov a, attrib lcall phex mov dptr, #mesg_cluster lcall pstr mov r0, #cluster acall phex32_at_r0 mov dptr, #mesg_size lcall pstr mov r0, #size acall phex32_at_r0 lcall newline mov r0, #dir_position_cluster acall phex32_at_r0 acall space mov a, dir_position_sector lcall phex acall space mov a, dir_position_offset lcall phex lcall newline ret ;convert "size" in bytes to the number of sectors. It's ;just a divide by 512 with rounding upbytes_to_sectors: mov r2, size+0 ;save lower 9 bits mov a, size+1 anl a, #1 mov r3, a clr c ;rotate right 1 bit mov a, size+3 rrc a mov size+3, a mov a, size+2 rrc a mov size+2, a mov a, size+1 rrc a mov size+1, a mov size+0, size+1 ;rotate another 8 bits mov size+1, size+2 mov size+2, size+3 mov size+3, #0 mov a, r2 jnz b2s_inc mov a, r3 jnz b2s_inc retb2s_inc: ;round up mov a, size+0 add a, #1 mov size+0, a mov a, size+1 addc a, #0 mov size+1, a mov a, size+2 addc a, #0 mov size+2, a ret;*************************************************************;** **;** IDE Disk Drive Driver Code **;** **;*************************************************************ide_read_sector: lcall ide_busy mov dptr, #ide_head mov a, lba+3 anl a, #0x0F orl a, master_slave movx @dptr, a mov dptr, #ide_cyl_msb mov a, lba+2 movx @dptr, a mov dptr, #ide_cyl_lsb mov a, lba+1 movx @dptr, a mov dptr, #ide_sector mov a, lba+0 movx @dptr, a mov dptr, #ide_sec_cnt mov a, #1 movx @dptr, a mov dptr, #ide_command mov a, #ide_cmd_read movx @dptr, a ret ;ask the drive to run in it's lowest current mode ;does this work? Need to fiddle with it some more.ide_set_low_power: ;acall ide_drq mov dptr, #ide_features mov a, #0x9A ;set current subcommand movx @dptr, a mov dptr, #ide_sec_cnt mov a, #1 ;lowest available current movx @dptr, a mov dptr, #ide_command mov a, #ide_cmd_set_features movx @dptr, a ret ;put the drive into sleep modeide_sleep: ; acall ide_busy mov dptr, #ide_command mov a, #ide_cmd_sleep movx @dptr, a ;acall ide_busy mov dptr, #ide_status movx a, @dptr retide_reset: mov dptr, #0xFF32 mov a, #255 movx @dptr, a ;assert drive's reset pin mov r0, #0 djnz r0, * djnz r0, * djnz r0, * mov a, #0 movx @dptr, a ;de-assert drive's reset pin djnz r0, * djnz r0, * djnz r0, * retide_init:ideiwait: mov a, #'.' ;should slow down the printing of dots lcall cout lcall wait mov master_slave, #0xE0 acall idei_get_status jb acc.7, idei_try_slave ;wait for BSY bit to be clear jb acc.6, idei_ready ;wait for RDY bit to be setidei_try_slave: mov master_slave, #0xF0 acall idei_get_status jb acc.7, ideiwait ;wait for BSY bit to be clear jnb acc.6, ideiwait ;wait for RDY bit to be setidei_ready: lcall newline mov dptr, #msg_found_ide lcall pstr mov dptr, #msg_master mov a, master_slave jnb acc.4, idei2 mov dptr, #msg_slaveidei2: lcall pstr lcall ide_busy mov dptr, #ide_command mov a, #ide_cmd_id movx @dptr, a ;ask for device ID data lcall ide_drq lcall grab_data ;fetch 512 bytes of ID data mov dptr, #msg_cylinders lcall pstr mov dptr, #sector_buffer + 2 movx a, @dptr push acc inc dptr movx a, @dptr mov dph, a pop dpl lcall pint16u mov dptr, #msg_heads lcall pstr mov dptr, #sector_buffer + 6 movx a, @dptr lcall pint8u mov dptr, #msg_sectors lcall pstr mov dptr, #sector_buffer + 12 movx a, @dptr lcall pint8u lcall newline lcall ide_busy mov dptr, #sector_buffer + 6 movx a, @dptr ;read # of heads from ID info dec a orl a, master_slave anl a, #0xBF mov dptr, #ide_head movx @dptr, a mov dptr, #sector_buffer + 12 movx a, @dptr ;read # sector/track from ID info mov dptr, #ide_sec_cnt movx @dptr, a mov dptr, #ide_command mov a, #ide_cmd_initparms movx @dptr, a ;do the init parameters command lcall ide_busy ;make sure drive is ready retidei_get_status: mov dptr, #ide_head mov a, master_slave movx @dptr, a ;select the master or slave device mov dptr, #ide_status movx a, @dptr retide_busy: mov dptr, #ide_status movx a, @dptr push acc ;mov a, #'.' ;lcall cout lcall wait pop acc jb acc.7, ide_busy ;wait for BSY to be clear retide_drq: mov dptr, #ide_status movx a, @dptr push acc ;mov a, #'_' ;lcall cout lcall wait pop acc jb acc.7, ide_drq ;wait for BSY to be clear jnb acc.3, ide_drq ;wait for DRQ to be set retprint_sector_buffer: push acc push dpl push dph mov a, r0 push acc mov a, r1 push acc mov dptr, #mesg_sector_buffer lcall pstr mov r0, #32 mov dptr, #sector_bufferpb1: mov r1, #16pb2: movx a, @dptr inc dptr lcall phex lcall space djnz r1, pb2 clr c mov a, dpl subb a, #16 mov dpl, a mov a, dph subb a, #0 mov dph, a mov r1, #16pb3: movx a, @dptr inc dptr anl a, #0x7F add a, #224 jc pb4 mov a, #' ' - 32pb4: add a, #32 lcall cout djnz r1, pb3 lcall newline djnz r0, pb1 lcall newline pop acc mov r1, a pop acc mov r0, a pop dph pop dpl pop acc retgrab_data: clr a mov dptr, #0xFF31 movx @dptr, a ;clear the address counter mov dptr, #0xFF30 movx a, @dptr ;transfer bytes 0 to 31 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 32 to 63 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 64 to 95 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 96 to 127 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 128 to 159 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 160 to 191 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 192 to 223 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 224 to 255 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 256 to 287 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 288 to 319 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 320 to 351 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 352 to 383 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 384 to 415 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 416 to 447 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 448 to 479 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr ;transfer bytes 480 to 511 movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr movx a, @dptr retmesg_read_mbr: .db "Reading Master Boot Record",13,10,0mesg_bad_mbr: .db "MBR Signature Not Found",13,10,0msg_unknown_partion_type: .db "Unknown Partition Type: ",0mesg_partition_at: .db "Found FAT32 Partition at LBA = ",0mesg_read_vol_id: .db "Reading FAT32 Volume ID",13,10,0mesg_bad_vol_id: .db "Bad FAT32 Volume ID",13,10,0mesg_first_data_sec: .db "First Data Sector at LBA = ",0mesg_playing_file: .db "\\[Play: ",0mesg_vol_id_ok: .db "Volume ID looks ok",13,10,0mesg_sec_per_cluster: .db "Sectors per cluster: ",0mesg_root_dir_at_cluster: .db "Root directory starts at cluster # ",0mesg_sectors_for_fats: .db "Sectors used for FAT tables: ",0mesg_reserved_sectors: .db "Reserved Sectors: ",0mesg_attrib: .db 13,10 .db "\\] Attrib=",0mesg_cluster: .db " First_Cluster=",0mesg_size: .db " Size=",0mesg_welcome: .db 13,10,13,10,13,10 .db "\\[\r\nVersion 0.1.3 (no SIMM)\r\n\\]",13,10 .db "MP3 Player, Version 0.1.3, December 17, 2001",13,10 .db "Copyright (C) 2000, PJRC.COM, LLC",10,13,10,13 .db "Type 'QUIT' to return to the monitor",13,10,13,10,0mesg_begin: .db 13,10,"\\[MP3 Player, Begin Play\r\n\\]",13,10,0mesg_xilinx_cfg: .db "Configuring Xilinx XCS10XL FPGA Chip: ",0mesg_ok: .db "Ok",13,10,0mesg_error: .db "Error!",13,10,0mesg_reset_ide: .db "Reseting IDE Devices",13,10,0mesg_sta013_cfg: .db "Configuring STA013 MP3 Decoder Chip: ",0mesg_ide_init: .db "Waiting for Hard Drive to be ready",13,10,0msg_found_ide: .db "Found IDE ",0msg_master: .db "Master",0msg_slave: .db "Slave",0msg_cylinders: .db ", Cylinders=",0msg_heads: .db ", Heads=",0msg_sectors: .db ", Sectors=",0mesg_sector_buffer: .db 13,10,"Current Sector Buffer Contents:",13,10,0mesg_play: .db "Play",13,10,0mesg_pause: .db "Pause",13,10,0mesg_next: .db "Next File",13,10,0mesg_prev: .db "Previous File",13,10,0mesg_rand: .db "Random O",0mesg_vol_up: .db "Vol Up",13,10,0mesg_vol_down: .db "Vol Down",13,10,0str_quit: .db 4, "QUIT"str_play: .db 4, "PLAY"str_next: .db 4, "NEXT"str_previous: .db 8, "PREVIOUS"
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -