diff --git a/branches/dgg/Applegate/Makefile b/branches/dgg/Applegate/Makefile deleted file mode 100644 index 0f330c29..00000000 --- a/branches/dgg/Applegate/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -# Makefile 1/31/2013 dwg - - -TASM := ../XSource/bin/TASM -TASMTABS := . -export TASMTABS - -ASMOPT80 := -t$(CPU) -g3 -ASMOPT85 := -t85 -g3 - -ASM80 := $(TASM) $(ASMOPT80) -ASM85 := $(TASM) $(ASMOPT85) -ASMIMG := $(TASM) $(ASMOPT80) -b -fE5 - -all: zapple.bin cpm.bin bios.bin - -tasm80.tab: bin/TASM80.TAB - cp bin/TASM80.TAB tasm80.tab - -tasm85.tab: bin/TASM85.TAB - cp bin/TASM85.TAB tasm85.tab - -cpm.bin: cpm22.asm - $(ASMIMG) $< $@ - -bios.bin: bios.asm s100iobd.inc - $(ASMIMG) bios.asm $@ - -zapple.bin: zapple.asm zapple.z80 - $(ASMIMG) zapple.asm $@ - -clean: - rm -f *.lst *.bin diff --git a/branches/dgg/Applegate/bios.asm b/branches/dgg/Applegate/bios.asm deleted file mode 100644 index 4342ceec..00000000 --- a/branches/dgg/Applegate/bios.asm +++ /dev/null @@ -1,1502 +0,0 @@ -;******************************************************** -; Bob's very simple BIOS. -; -; Work started in, oh, I don't know, probably 2008. - -; Work RE-started on 02/14/2013 -; -; Hardware description: -; -; Northstar ZPU -; CCS 2710 serial port. Console on first port. -; N8VEM 4MB RAM with only 1 MB installed -; N8VEM IDE with a CF card -; -; This is a merge of many pieces of code from all over -; the net, very little of it is mine other than some -; glue logic. So, here are some of the sources of info -; and code I borrowed from: -; -; www.speakeasy.org/~rzh/bios.mac -; http://www.s100computers.com/My%20System%20Pages/IDE%20Board/My%20IDE%20Card.htm -; -; These are some of my include files to make things easier -; for me. -; -#include "tasm.inc" -#include "cpm22.inc" -; -; Put out a bit of diagnostics -; - .echo "Building a BIOS for a RAM size of " - .echo RAMSIZE - .echo "K\n" -; -; Common CP/M items -; -DefaultDisk equ TDRIVE ;I like this name better -BDOSEntry equ (CCPBASE+CCPSIZE+6) -CPM_SECTOR_SIZE equ 128 -; -; Base ports of various I/O devices. -; -IDE_PORT EQU 030H ;IDE board -; -; Base memory locations of various things -; -CCPEntry EQU CCPBASE -CPM_VERSION .equ 22H ;CP/M version -; -; Constants -; -FALSE .equ 0 -TRUE .equ ~FALSE -; -; ASCII constants -; -CR .equ 0dh -LF .equ 0ah -BELL .equ 07h -EOF .equ 01ah ;CTRL-Z is CP/M EOF -; -; IDE board constants -; -IDEportA EQU IDE_PORT+0 ;Lower 8 bits of IDE interface (8255) -IDEportB EQU IDE_PORT+1 ;Upper 8 bits of IDE interface -IDEportC EQU IDE_PORT+2 ;Control lines for IDE interface -IDEportCtrl EQU IDE_PORT+3 ;8255 configuration port - -READcfg8255 EQU 10010010b ;Set 8255 IDEportC out, IDEportA/B input -WRITEcfg8255 EQU 10000000b ;Set all three 8255 ports output - -;IDE control lines for use with IDEportC. Change these 8 -;constants to reflect where each signal of the 8255 each of the -;IDE control signals is connected. All the control signals must -;be on the same port, but these 8 lines let you connect them to -;whichever pins on that port. - -IDEa0line EQU 01H ;direct from 8255 to IDE interface -IDEa1line EQU 02H ;direct from 8255 to IDE interface -IDEa2line EQU 04H ;direct from 8255 to IDE interface -IDEcs0line EQU 08H ;inverter between 8255 and IDE interface -IDEcs1line EQU 10H ;inverter between 8255 and IDE interface -IDEwrline EQU 20H ;inverter between 8255 and IDE interface -IDErdline EQU 40H ;inverter between 8255 and IDE interface -IDErstline EQU 80H ;inverter between 8255 and IDE interface -; -;Symbolic constants for the IDE Drive registers, which makes the -;code more readable than always specifying the address pins - -REGdata EQU IDEcs0line -REGerr EQU IDEcs0line + IDEa0line -REGseccnt EQU IDEcs0line + IDEa1line -REGsector EQU IDEcs0line + IDEa1line + IDEa0line -REGcylinderLSB EQU IDEcs0line + IDEa2line -REGcylinderMSB EQU IDEcs0line + IDEa2line + IDEa0line -REGshd EQU IDEcs0line + IDEa2line + IDEa1line ;(0EH) -REGcommand EQU IDEcs0line + IDEa2line + IDEa1line + IDEa0line ;(0FH) -REGstatus EQU IDEcs0line + IDEa2line + IDEa1line + IDEa0line -REGcontrol EQU IDEcs1line + IDEa2line + IDEa1line -REGastatus EQU IDEcs1line + IDEa2line + IDEa1line + IDEa0line - -;IDE Command Constants. These should never change. - -COMMANDrecal EQU 10H -COMMANDread EQU 20H -COMMANDwrite EQU 30H -COMMANDinit EQU 91H -COMMANDid EQU 0ECH -COMMANDspindown EQU 0E0H -COMMANDspinup EQU 0E1H -; -; -; IDE Status Register: -; bit 7: Busy 1=busy, 0=not busy -; bit 6: Ready 1=ready for command, 0=not ready yet -; bit 5: DF 1=fault occured insIDE drive -; bit 4: DSC 1=seek complete -; bit 3: DRQ 1=data request ready, 0=not ready to xfer yet -; bit 2: CORR 1=correctable error occured -; bit 1: IDX vendor specific -; bit 0: ERR 1=error occured -; -; - -; -; A Z80 JP instruction is manually put into a few locations -; by the BIOS, so here is an equate for that instruction. -; -JMP equ 0c3h - .page -;******************************************************** -; PRIMARY JUMP TABLE. ALL CALLS FROM CP/M TO THE CBIOS -; COME THROUGH THIS TABLE. -;******************************************************** -; - .org BIOSBASE -; - JP CBOOT ;COLD BOOT -WBOOTE: JP WBOOT ;WARM BOOT - JP CONST ;CONSOLE STATUS - JP CONIN ;CONSOLE CHARACTER IN - JP CONOUT ;CONSOLE CHARACTER OUT, - JP LIST ;LIST CHARACTER OUT - JP PUNCH ;PUNCH CHARACTER OUT - JP READER ;READER CHARACTER IN - JP HOME ;MOVE HEAD TO HOME POSITION - JP SELDSK ;SELECT DISK - JP SETTRK ;SET TRACK NUMBER - JP SETSEC ;SET SECTOR NUMBER - JP SETDMA ;SET DMA ADDRESS - JP READ ;READ DISK - JP WRITE ;WRITE DISK - JP LISTST ;RETURN LIST STATUS - JP SECTRA ;SECTOR TRANSLATE -; -;******************************************************** -; Sneaking little Bob trick. My program to write CP/M -; to the disk needs to know the end of the BIOS, so I -; decided to put the last memory location used by the -; BIOS into the two bytes before the CBOOT code. So the -; program can find the end by picking up the first JP -; address in the jump table, and backing up two bytes. -; - DW BIOS_END - .page -; -;******************************************************** -; -; This is the cold boot entry point, called from the first -; entry in the jump table. Control will be transfered here -; by the CP/M bootstrap loader. -; - -CBOOT: ld sp,0080h ;set stack pointer - call initser ;initialize the serial port - call IDEinit ;initialize the IDE interface - - - call msg - .db CR,LF,LF - .text "Bob's BIOS :)" - .db CR,LF - .text "??" - .text "K CP/M v2.2" - .db CR,LF, - .text "Drives:" - .db CR,LF - .text " A: = IDE" - .db CR,LF,LF,0 - -gocpm: di ;disable interrupts -; -; Reset the IOBYTE to go to the main terminal -; - ld a,00000001B - ld (IOBYTE),a -; -; Set the default drive to A: and user to 0 -; - xor a - ld (DefaultDisk),a -; - jp EnterCPM ;continue set-up -; -;******************************************************** -; WARNING... The warm boot code is NOT COMPLETE!!! -; -WBOOT: - call msg - TEXT "Entering WBOOT" - db CR,LF,0 - -; -; Need to add a lot of logic here to reload the CCP and -; BDOS from disk, but for now we know they're already -; loaded and no need to load again. - - - jp EnterCPM -; -;******************************************************** -; -; This routine is entered either from the cold or warm -; boot code. It sets up the JP instructions in the -; base page, and also sets the high-level disk driver's -; input/output address (also known as the DMA address). -; -EnterCPM: ld a,JMP ;Get machine code for JP - ld (0),a ;Set up Jp at location 0 - ld (ENTRY),a ;...and at location 5 -; - ld hl,WBOOTE ;Get BIOS vector address - ld (1),hl ;Put it at location 1 - - ld hl,BDOSEntry ;Get BDOS entry point address - ld (ENTRY+1),hl ;Put it at location 6 -; - ld bc,80H ;Set disk I/O address to default - call SETDMA ;Use normal BIOS routine -; - ei ;Ensure interrupts are enabled - ld a,(DefaultDisk) ;Transfer current default disk to - ld c,a ; Console Command Processor - jp CCPEntry ;Jump to CCP - - - -;******************************************************** -; Select the disk drive for future reads/writes. On entry -; C contains the drive index: C = 0 for A:, 1 for B:, etc. -; On Exit, HL contains the pointer to the disk parameter -; header (section 6.10 in the CP/M book) or 0000 if the -; requested drive is out of range. -;******************************************************** - -SELDSK: push bc - call msg - TEXT "SELDSK: " - db 0 - pop bc - push bc - ld a,c - add a,'A' - ld c,a - call CONOUT - call msg - db ':',CR,LF,0 - pop bc -; -; Temp patch... always do deblocking for now. Some day -; I might add a disk that doesn't need it, but for now -; we always need it. -; - push af - ld a,0ffh - ld (DeblockingRequired),a - pop af -; - ld hl,0 ;assume an error - ld a,c ;move drive into A - cp 1 ;compare to max drives - ret nc ;return if bad drive -; -; Compute offset to disk parameter table... drive * 16 -; - ld l,a - ld h,0 - add hl,hl ;*2 - add hl,hl ;*4 - add hl,hl ;*8 - add hl,hl ;*16 - ld de,DPBASE - add hl,de - ret -; -;******************************************************** -; FLOPPY DISK DPH TABLES. -;******************************************************** -; -; CP/M manual, 6.10, page145 -; -DPBASE: -IdeDPH: dw 0 ;no sector translation - dw 0 ;scratchpad - dw 0 - dw 0 - dw DirectoryBuffer - dw IdeDPB ;disk parameter block - dw IdeCSV ;checksum area - dw IdeALV - -IdeCSV: .FILL 0 ;no directory checksum; non-removable drive -IdeALV: .FILL 256,0 ;drive size / BLS / 8 - -;__________________________________________________________________________________________________ -; -; 8MB HARD DISK DRIVE, 65 TRKS, 1024 SECS/TRK, 128 BYTES/SEC -; BLOCKSIZE (BLS) = 4K, DIRECTORY ENTRIES = 128 -; SEC/TRK ENGINEERED SO THAT AFTER DEBLOCKING, SECTOR NUMBER OCCUPIES 1 BYTE (0-255) -; -; The SPT value was taken from the track count from MYIDE (an Andrew Lynch -; program) and then multiplied by 4 since there are 4 CP/M 128 byte sectors -; in each 512 byte physical sector. -; -; Too many magic numbers in here; add some EQUs for these and use real math -; to compute the values at assembly time. -; - .DB (4096 / 128) ; RECORDS PER BLOCK (BLS / 128) -IdeDPB: -; .DW 1024 ; SPT: SECTORS PER TRACK - .DW 32*4 ; SPT: Sectors per track, gotten from drive - .DB 5 ; BSH: BLOCK SHIFT FACTOR - .DB 31 ; BLM: BLOCK MASK - .DB 1 ; EXM: EXTENT MASK - .DW 2047 ; DSM: TOTAL STORAGE IN BLOCKS - 1 BLK = ((8MB - 128K OFF) / 4K BLS) - 1 = 2047 - .DW 511 ; DRM: DIR ENTRIES - 1 = 512 - 1 = 511 - .DB 11110000B ; AL0: DIR BLK BIT MAP, FIRST BYTE - .DB 00000000B ; AL1: DIR BLK BIT MAP, SECOND BYTE - .DW 0 ; CKS: DIRECTORY CHECK VECTOR SIZE = 256 / 4 - .DW 1 ; OFF: RESERVED TRACKS = 1 TRKS * (512 B/SEC * 1024 SEC/TRK) = 128K -; -DirectoryBuffer ds CPM_SECTOR_SIZE - - -; -; OLD CODE WARNING... -; This is my first attempt to calculate disk parameters. Left it all in -; here because it's the right way to do it, but needs debugging. -; -;SECSZ: equ 512 ;bytes per sector -;CPMSECS: equ (SECSZ/128) ;CP/M records per phys sector -;SECTORS: equ 64 ;sectors per track -;TRACKS: equ (65536/SECTORS/CPMSECS); -; -;SPT: equ (SECTORS*CPMSECS) -;BLS: equ 8192 -;BLM: equ (BLS/128-1) -; #if (BLS == 1024) -;BSH equ 3 -; #endif -; #if (BLS == 2048) -;BSH equ 4 -; #endif -; #if (BLS == 4096) -;BSH equ 5 -; #endif -; #if (BLS == 8192) -;BSH equ 6 -; #endif -; #if (BLS == 16384) -;BSH equ 7 -; #endif -;OFF: equ 1 -;DSM: equ (((TRACKS-OFF)*SECSZ*SECTORS/BLS)-1) -; #if (DSM < 256) -;EXM equ (BLS/1024-1) -; #else -;EXM equ (BLS/2048-1) -; #endif -;DRM: equ (1024-1);is this a good value? -; -;fldpb: .dw SPT ;CP/M records per track -; .db BSH ;allocation block shift -; .db BLM ;allocation block mask -; .db 0 ;extent mask -; .dw DSM ;max allocation block # -; .dw 255 ;max directory entry # -; .db 0f0h,0 ;directory allocation mask -; .dw 64 ;directory check alloc size -; .dw OFF ;number of reserved tracks - -;IdeDPB: dw SECTORS ;sectors per track -; db BSH -; db BLM -; db EXM -; dw DSM -; dw DRM -; db AL0 -; db AL1 -; dw CKS -; dw OFF - - -;dphbase0: .dw trans ;LOGICAL TO PHYSICAL XLATE TAB -; .dw 0 ;SCRATCH -; .dw 0 -; .dw 0 -; .dw DIRBUF ;DIRECTORY BUFFER -; .dw fldpb ;DISK PARAMETER BLOCK -; .dw chk00 ;CHECKSUM VECTOR -; .dw ALV0 ;ALLOCATION VECTOR -; -;dphbase1: .dw trans -; .dw 0 -; .dw 0 -; .dw 0 -; .dw DIRBUF -; .dw fldpb -; .dw chk01 -; .dw ALV1 -; -;******************************************************** -; Sector translation table. The IDE drive does not do -; translation but left it here for future use. Ie, it -; might be used later but could be removed for now. -; -trans: .db 0,1,2,3,4,5,6,7 - .db 8,9,10,11,12,13,14,15 - .db 16,17,18,19,20,21,22,23 - .db 24,25,26,27,28,29,30,31 -; -;******************************************************** -; CP/M DPB -; -; AGAIN, OLD CODE WARNING!!!! Some of this was carry-over -; from my previous attempt to read BoGUS format disks. -; BoGUS was a CP/M box made by Franklin Computer in 1984. -; There are about 3 in existance today. -; -; BoGUS = Bob Grieb's Underground System -; -; This has always been one of the most confusing bits of -; CP/M legacy. To make things a tad easier, here are some -; bits of data that will make reading section 6.10 of the -; "CP/M Operating System Manual" a bit clearer. -; -; The CF drive I'm using (Sandisk SDCFB-192) has the -; following raw parameters. Hex numbers first, decimal -; in parens: -; -; Cylinders: 02DE (734) -; Heads: 10 (16) -; Sectors: 20 (32) -; Sector size: (512) -; -; Total disk size = 734*16*32*512 = 192,413,696 bytes -; -; SPT = 128 Sectors per track -; BLS = -; 1 Reserved track - -; -; BLS = 2048 (why, I don't know) -; 9 physical sectors per track, 4 CP/M sectors each -; DOuble sided -; 2 reserved tracks -; -;TRACKS: .equ (80 * 2);total tracks (count both sides) -;SECTORS: .equ 9 ;sectors per track -;SECSZ: .equ 512 ;bytes per sector -;CPMSECS: .equ (SECSZ/128) ;CP/M records per phys sector -; -;SPT: .equ (SECTORS*CPMSECS) -;BLS: .equ 2048 ;ask Dave ask to why -;BSH: .equ 4 -;BLM: .equ ((BLS/128)-1) -;OFF: .equ 2 -;DSM: .equ (((TRACKS-OFF)*SECSZ*SECTORS/BLS)-1) -; -;fldpb: .dw SPT ;CP/M records per track -; .db BSH ;allocation block shift -; .db BLM ;allocation block mask -; .db 0 ;extent mask -; .dw DSM ;max allocation block # -; .dw 255 ;max directory entry # -; .db 0f0h,0 ;directory allocation mask -; .dw 64 ;directory check alloc size -; .dw OFF ;number of reserved tracks - - - - - -;******************************************************** -; SET TRACK FOR FUTURE READS OR WRITES TO TRACK 0. ALSO -; PARTIALLY RESET THE DISK SYSTEM TO ALLOW FOR CHANGED -; DISKS. -;******************************************************** - -HOME: call msg - .text "HOME" - db CR,LF,0 - - ld a,(MustWriteBuffer) ;unwritten data? - or a - jp nz,HomeNoWrite - ld (DataInDiskBuffer),a -HomeNoWrite: ld c,0 ;set to track 0 - jp SETTRK - - -;******************************************************** -; SET TRACK FOR FUTURE READS OR WRITES TO THAT PASSED -; IN REGISTER PAIR BC. -;******************************************************** - -SETTRK: ld l,c - ld h,b - ld (SelectedTrack),hl - -; call msg -; db "SETTRK: ",0 -; ld a,h -; call a_hex -; ld a,l -; call a_hex -; call crlf - - ret - -;******************************************************** -; SET SECTOR FOR FUTURE READS OR WRITES TO THAT PASSED -; IN REGISTER PAIR BC. -;******************************************************** - -SETSEC: ld a,c - ld (SelectedSector),a - -; push af -; call msg -; db "SETSEC: ",0 -; pop af -; call a_hex -; call crlf - ret - -;******************************************************** -; SET DMA ADDRESS FOR FUTURE READS OR WRITES TO THAT -; PASSED IN REGISTER PAIR BC. -;******************************************************** - -SETDMA: ld l,c - ld h,b - ld (DMAAddress),hl - -#IF 0 ;debug code - push hl ;DEBUG - call msg - db "SETDMA: ",0 - pop hl - push hl - ld a,h - call a_hex - ld a,l - call a_hex - call crlf - pop hl ;END DEBUG -#ENDIF - - ret - -;******************************************************** -; SECTOR TRANSLATION ROUTINE. THE ROUTINE ONLY -; TRANSLATES SECTORS ON THE USER TRACKS, SINCE CP/M -; ACCESSES THE SYSTEM TRACKS WITHOUT CALLING FOR -; TRANSLATION. -; BC contains the sector number to translate, and the -; translation table address is in DE. Returns result -; in HL. -;******************************************************** - -SECTRA: ld l,c ;no translation - ld h,b - ret - -;******************************************************** -; The main events... read and write routines! They share -; a lot of common code, so each of these is pretty small, -; falls into common area, then eventually splits again. -;******************************************************** - -READ: -; Read in the 128-byte CP/M sector specified by previous calls -; to select disk and to set track and sector. The sector will be read -; into the address specified in the previous call to set DMA address. -; -; If reading from a disk drive using sectors larger than 128 bytes, -; deblocking code will be used to "unpack" a 128-byte sector from -; the physical sector. - -; call msg -; db "READ",CR,LF,0 - ld a,(DeblockingRequired) ;Check if deblocking needed - or a ;(flag was set in SELDSK call) - jp z,ReadNoDeblock ;No, use normal nondeblocked - -; The deblocking algorithm used is such -; that a read operation can be viewed -; up until the actual data transfer as -; though it was the first write to an -; unallocated allocation block. - - xor a ;Set the record count to 0 - ld (UnallocatedRecordCount),a ; for first "write" - inc a ;Indicate that it is really a read - ld (ReadOperation),a ;that is to be performed - ld (MustPrereadSector),a ;and force a preread of the sector - ;to get it into the disk buffer - ld a,WriteUnallocated ;Fake deblocking code into responding - ld (WriteType),a ;as if this is the first write to an - ;unallocated allocation block. - jp PerformReadWrite ;Use common code to execute read - - - -WRITE: -; -; Write a 128-byte sector from the current DMA address to -; the previously selected disk, track, and sector. -; -; On arrival here, the BDOS will have set register C to indicate -; whether this write operation is to an already allocated allocation -; block (which means a preread of the sector may be needed), -; to the directory (in which case the data will be written to the -; disk immediately), or to the first 128-byte sector of a previously -; unallocated allocation block (in which case no preread is required). -; -; Only writes to the directory take place immediately. In all other -; cases, the data will be moved from the DMA address into the disk -; buffer, and only written out when circumstances force the -; transfer. The number of physical disk operations can therefore -; be reduced considerably. -; - - ld a,(DeblockingRequired) ;Check if deblocking is required - or a ;(flag set in SELDSK call) - jp z,WriteNoDeblock - - xor a ;Indicate that a write operation - ld (ReadOperation),a ; is required (i.e. NOT a read) - ld a,c ;Save the BDOS write type - ld (WriteType),a - cp WriteUnallocated ;Check if the first write to an - ; unallocated allocation block - jp nz,CheckUnallocatedBlock ;No, check if in the middle of - ; writing to an unallocated block - ;Yes, first write to unallocated - ; allocation block -- initialize - ; variables associated with - ; unallocated writes. - ld a,AllocationBlockSize/128 ;Get number of 128-byte - ; sectors and - ld (UnallocatedRecordCount),a ; set up a count. - ; - ld hl,SelectedDkTrkSec ;Copy disk, track and sector - ld de,UnallocatedDkTrkSec ; into unallocated variables - call MoveDkTrkSec - -; -; Check if this is not the first write to an unallocated -; allocation block -- if it is, the unallocated record count -; has just been set to the number of 128-byte sectors in the -; allocation block. -; -CheckUnallocatedBlock: - ld a,(UnallocatedRecordCount) - or a - jp z,RequestPreread ;No, this is a write to an - ; allocated block - ;Yes, this is a write to an - ; unallocated block - dec a ;Count down on number of 128-byte sectors - ; left unwritten to in allocation block - ld a,(UnallocatedRecordCount) ; and store back new value. - - ld hl,SelectedDkTrkSec ;Check if the selected disk, track, - ld de,UnallocatedDkTrkSec ; and sector are the same as for - call CompareDkTrkSec ; those in the unallocated block. - jp nz,RequestPreread ;No, a preread is required - ;Yes, no preread is needed. - ;Now is a convenient time to - ; update the current sector and see - ; if the track also needs updating. -; - ;By design, Compare$Dk$Trk$Sec - ; returns with - ; DE -> Unallocated$Sector - ex de,hl ; HL -> Unallocated$Sector - inc (hl) ;Update Unallocated$Sector - ld a,(hl) ;Check if sector now > maximum - cp CPMSecPerTrack ; on a track - jp c,NoTrackChange ;No (A < (HL) ) - ;Yes, - ld (hl),0 ;Reset sector to 0 - ld hl,(UnallocatedTrack) ;Increase track by 1 - inc hl - ld (UnallocatedTrack),hl -; -NoTrackChange: - ;Indicate to later code that - ; no preread is needed. - xor a - ld (MustPrereadSector),a ;Must$Preread$Sector=0 - jp PerformReadWrite - -RequestPreread: - xor a ;Indicate that this is not a write - ld (UnallocatedRecordCount),a ; into an unallocated block. - inc a - ld (MustPrereadSector),a ;Indicate that a preread of the - ; physical sector is required. -; -; -PerformReadWrite: ;Common code to execute both reads and - ; writes of 128-byte sectors. - xor a ;Assume that no disk errors will - ld (DiskErrorFlag),a ; occur - - ld a,(SelectedSector) ;Convert selected 128-byte sector - rra ; into physical sector by dividing by 4 - rra - and 3fh ;Remove any unwanted bits - ld (SelectedPhysicalSector),a - ; - ld hl,DataInDiskBuffer ;Check if disk buffer already has - ld a,(hl) ; data in it. - ld (hl),1 ;(Unconditionally indicate that - ; the buffer now has data in it) - or a ;Did it indeed have data in it? - jp z,ReadSectorIntoBuffer ;No, proceed to read a physical - ; sector into the buffer. - ; - ;The buffer does have a physical sector - ; in it. - ; Note: The disk, track, and PHYSICAL - ; sector in the buffer need to be - ; checked, hence the use of the - ; Compare$Dk$Trk subroutine. - ; - ld de,InBufferDkTrkSec ;Check if sector in buffer is the - ld hl,SelectedDkTrkSec ; same as that selected earlier - call CompareDkTrk ;Compare ONLY disk and track - jp nz,SectorNotInBuffer ;No, it must be read in - - ld a,(InBufferSector) ;Get physical sector in buffer - ld hl,SelectedPhysicalSector - cp (hl) ;Check if correct physical sector - jp z,SectorInBuffer ;Yes, it is already in memory -SectorNotInBuffer: - ;No, it will have to be read in - ; over current contents of buffer - ld a,(MustWriteBuffer) ;Check if buffer has data in that - or a ; must be written out first - call nz,WritePhysical ;Yes, write it out -; -ReadSectorIntoBuffer: - call SetInBufferDkTrkSec ;Set in buffer variables from - ; selected disk, track, and sector - ; to reflect which sector is in the - ; buffer now. - ld a,(MustPrereadSector) ;In practice, the sector need only - or a ; be physically read in if a preread - ; is required - call nz,ReadPhysical ;Yes, preread the sector - xor a ;Reset the flag to reflect buffer - ld (MustWriteBuffer),a ; contents. -; -SectorInBuffer: ;Selected sector on correct track and - ; disk is already in the buffer. - ;Convert the selected CP/M (128-byte) - ; sector into a relative address down - ; the buffer. - ld a,(SelectedSector) ;Get selected sector number - and SectorMask ;Mask off only the least significant bits - ld l,a ;Multiply by 128 by shifting 16-bit value - ld h,0 ; left 7 bits - add hl,hl ;* 2 - add hl,hl ;* 4 - add hl,hl ;* 8 - add hl,hl ;* 16 - add hl,hl ;* 32 - add hl,hl ;* 64 - add hl,hl ;* 128 -; - ld de,DiskBuffer ;Get base address of disk buffer - add hl,de ;Add on sector number * 128 - ;HL -> 128-byte sector number start - ; address in disk buffer - ex de,hl ;DE -> sector in disk buffer - ld hl,(DMAAddress) ;Get DMA address set in SETDMA call - ex de,hl ;Assume a read operation, so - ; DE -> DMA address - ; HL -> sector in disk buffer - ld c,128/8 ;Because of the faster method used - ; to move data in and out of the - ; disk buffer, (eight bytes moved per - ; loop iteration) the count need only - ; be 1/8th of normal. - ;At this point -- - ; C = loop count - ; DE -> DMA address - ; HL -> sector in disk buffer - ld a,(ReadOperation) ;Determine whether data is to be moved - or a ; out of the buffer (read) or into the - jp nz,BufferMove ; buffer (write) - ;Writing into buffer - ;(A must be 0 get here) - inc a ;Set flag to force a write - ld (MustWriteBuffer),a ; of the disk buffer later on. - ex de,hl ;Make DE -> sector in disk buffer - ; HL -> DMA address -; -; -BufferMove: ;The following move loop moves eight bytes - ; at a time from (HL) to (DE), C contains - ; the loop count. - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - ld a,(hl) ;Get byte from source - ld (de),a ;Put into destination - inc de ;Update pointers - inc hl - - dec c ;Count down on loop counter - jp nz,BufferMove ;Repeat until CP/M sector moved - ; - ld a,(WriteType) ;If write to directory, write out - cp WriteDirectory ; buffer immediately - ld a,(DiskErrorFlag) ;Get error flag in case delayed write or read - ret nz ;Return if delayed write or read - ; - or a ;Check if any disk errors have occured - ret nz ;Yes, abandon attempt to write to directory - ; - xor a ;Clear flag that indicates buffer must be - ld (MustWriteBuffer),a ; written out - call WritePhysical ;Write buffer out to physical sector - ld a,(DiskErrorFlag) ;Return error flag to caller - ret -; -; -SetInBufferDkTrkSec: ;Indicate selected disk, track, and - ; sector now residing in buffer - ld a,(SelectedDisk) - ld (InBufferDisk),a - - ld hl,(SelectedTrack) - ld (InBufferTrack),hl - - ld a,(SelectedPhysicalSector) - ld (InBufferSector),a - - ret -; -CompareDkTrk: ;Compares just the disk and track - ; pointed to by DE and HL - ld c,3 ;Disk (1), track (2) - jp CompareDkTrkSecLoop ;Use common code - -CompareDkTrkSec: ;Compares the disk, track, and sector - ; variables pointed to by DE and HL - ld c,4 ;Disk (1), track (2), and sector (1) -CompareDkTrkSecLoop: - ld a,(de) ;Get comparitor - cp (hl) ;Compare with comparand - ret nz ;Abandon comparison if inequality found - inc de ;Update comparitor pointer - inc hl ;Update comparand pointer - dec c ;Count down on loop count - ret z ;Return (with zero flag set) - jp CompareDkTrkSecLoop -; -; Moves the disk, track and sector -; variables pointed at by HL to -; those pointed at by DE -; -MoveDkTrkSec: ld c,4 ;Disk (1), track (2), and sector (1) -MoveDkTrkSecLoop: - ld a,(hl) ;Get source byte - ld (de),a ;Store in destination - inc de ;Update pointers - inc hl - dec c ;Count down on byte count - ret z ;Return if all bytes moved - jp MoveDkTrkSecLoop - - - - - -; -; Should not get here with the IDE! -; - -ReadNoDeblock: - call msg - db "ERROR - ReadNoDeblock",CR,LF,0 - ret - -WriteNoDeblock: - call msg - db "ERROR - WriteNoDeblock",CR,LF,0 - ret - - - -; -; Here's the big high-level view of the logic here. It's -; rather involved since a lot of decisions needs to be made. -; -; First, the variables: -; -; DRIVE = This is the drive the user has selected. It may not -; be the same drive currently in use. -; -; TRACK = This is the track the user wants to use, 0-79. It -; may not be the current track we're on. -; -; SECTOR = The CP/M logic sector the user wants to use. 0 - 35. -; Again, this might not be the same as the current one. -; -; CURDRV = This is the currently selected drive OR NODRIVE if -; none selected yet. If NODRIVE that implies this is -; the first disk access. -; -; CURTRK = Track where the current drive has its head located. -; NOTRACK implies the location is unknown. -; -; CURSEC = Current physical sector with the side bit (bit 0) still -; included. -; - -; So here's the drive select logic... -; -; if (DRIVE != CURDRV) - a new drive is being selected -; if (CURDRV != NODRIVE) - if a valid drive is already selected -; Save the current track into the drive data area. -; Load the new drive's data from the drive data area. -; if (CURTRK == NOTRACK) - first time for this disk -; Home disk -; set CURTRK to 0 -; else -; save track to FDC -; else -; Home disk -; set CURTRK to 0 -; -; ...followed by the track select logic... -; -; if (TRACK != CURTRK) -; seek to TRACK -; set CURTRK to TRACK -; -; ...and then compute physical sector and side... -; -; divide sector by 4 for temp sector -; if bit 0 is set then select side 0, else select side 1 -; divide the temp sector by 2. This is now CURSEC. -; load CURSEC into the sector register -; -; Perform read or write operation -; - - - - - -; -;******************************************************** -; Initilze the 8255 and drive then do a hard reset on the drive, -; -IDEinit: ld a,READcfg8255 ;10010010b - OUT (IDEportCtrl),a ;Config 8255 chip, READ mode - - ld a,IDErstline - OUT (IDEportC),a ;Hard reset the disk drive - - ld B,020H ;<<<<< fine tune later -ResetDelay: DJNZ ResetDelay ;Delay (reset pulse width) - xor a - out (IDEportC),a ;No IDE control lines asserted - - ld D,11100000b ;Data for IDE SDH reg (512bytes, LBA mode,single drive,head 0000) - ;For Trk,Sec,head (non LBA) use 10100000 - ;Note. Cannot get LBA mode to work with an old Seagate Medalist 6531 drive. - ;have to use teh non-LBA mode. (Common for old hard disks). - - ld E,REGshd ;00001110,(0EH) for CS0,A2,A1, - CALL IDEwr8D ;Write byte to select the MASTER device -; - ld B,0FFH ;<<< May need to adjust delay time -WaitInit: ld E,REGstatus ;Get status after initilization - CALL IDErd8D ;Check Status (info in [D]) - BIT 7,D - jp z,DoneInit ;Return if ready bit is zero - ld A,2 - CALL DELAYX ;Long delay, drive has to get up to speed - DJNZ WaitInit - CALL SHOWerrors ;Ret with NZ flag set if error (probably no drive) - RET -DoneInit: xor A - RET -; -DELAYX: ld (DELAYStore),a - PUSH BC - ld bc,0FFFFH ;<<< May need to adjust delay time to allow cold drive to -DELAY2: LD a,(DELAYStore) ; get up to speed. -DELAY1: dec a - jp nz,DELAY1 - dec bc - ld A,C - or b - jp nz,DELAY2 - POP BC - RET -; -;******************************************************** -; Read a sector, specified by the 4 bytes in LBA -; Z on success, NZ call error routine if problem -; -ReadPhysical: ld hl,DiskBuffer - ld a,042h - ld b,0 -rpfill ld (hl),a - inc hl - ld (hl),a - inc hl - djnz rpfill - - call msg - db "ReadPhysical",CR,LF,0 - - CALL wrlba ;Tell which sector we want to read from. - ;Note: Translate first in case of an error otherewise we - ;will get stuck on bad sector - CALL IDEwaitnotbusy ;make sure drive is ready - jp c,SHOWerrors ;Returned with NZ set if error - - ld D,COMMANDread - ld E,REGcommand - CALL IDEwr8D ;Send sec read command to drive. - CALL IDEwaitdrq ;wait until it's got the data - jp c,SHOWerrors -; - ld hl,DiskBuffer ;DMA address - ld B,0 ;Read 512 bytes to [HL] (256X2 bytes) -MoreRD16: ld A,REGdata ;REG regsiter address - OUT (IDEportC),a - - OR IDErdline ;08H+40H, Pulse RD line - OUT (IDEportC),a - - IN a,(IDEportA) ;Read the lower byte first (Note early versions had high byte then low byte - ld (hl),a ;this made sector data incompatable with other controllers). - inc hl - IN a,(IDEportB) ;THEN read the upper byte - ld (hl),A - inc hl - - ld A,REGdata ;Deassert RD line - OUT (IDEportC),a - DJNZ MoreRD16 - - ld E,REGstatus - CALL IDErd8D - ld A,D - BIT 0,A - call nz,SHOWerrors ;If error display status - RET -; -;******************************************************** -;Write a sector, specified by the 3 bytes in LBA (@ IX+0)", -;Z on success, NZ to error routine if problem -; -WritePhysical: -; call msg -; db "WritePhysical",CR,LF,0 - - CALL wrlba ;Tell which sector we want to read from. - ;Note: Translate first in case of an error otherewise we - ;will get stuck on bad sector - CALL IDEwaitnotbusy ;make sure drive is ready - jp c,SHOWerrors - - ld D,COMMANDwrite - ld E,REGcommand - CALL IDEwr8D ;tell drive to write a sector - CALL IDEwaitdrq ;wait unit it wants the data - jp c,SHOWerrors -; - ld hl,DiskBuffer - ld B,0 ;256X2 bytes - - ld A,WRITEcfg8255 - OUT (IDEportCtrl),a -WRSEC1: ld A,(hl) - inc hl - OUT (IDEportA),a ;Write the lower byte first (Note early versions had high byte then low byte - ld A,(hl) ;this made sector data incompatable with other controllers). - inc hl - OUT (IDEportB),a ;THEN High byte on B - ld A,REGdata - PUSH af - OUT (IDEportC),a ;Send write command - OR IDEwrline ;Send WR pulse - OUT (IDEportC),a - POP af - OUT (IDEportC),a - DJNZ WRSEC1 - - ld A,READcfg8255 ;Set 8255 back to read mode - OUT (IDEportCtrl),a - - ld E,REGstatus - CALL IDErd8D - ld A,D - BIT 0,A - call nz,SHOWerrors ;If error display status - RET -; -;******************************************************** -; Write the logical block address to the drive's registers -; Note we do not need to set the upper nibble of the LBA -; It will always be 0 for these small drives. Use the -; physical sector number which has already been divided -; down from the logical sector number. -; -wrlba: ld hl,(SelectedPhysicalSector) - ld a,l - inc a ;Sectors are numbered 1 to MAXSEC - ld (DRIVESEC),a ;For Diagnostic Display Only - ld D,A - ld E,REGsector ;Send info to drive - call IDEwr8D - ;Note: For drive we will have 0 - MAXSEC sectors only -; ld hl,TRK - ld hl,(SelectedTrack) - ld A,L - ld (DRIVETRK),a - ld D,L ;Send Low TRK# - ld E,REGcylinderLSB - call IDEwr8D - - ld A,H - ld (DRIVETRK+1),a - ld D,H ;Send High TRK# - ld E,REGcylinderMSB - call IDEwr8D - - ld D,1 ;For now, one sector at a time - ld E,REGseccnt - call IDEwr8D - -;DEBUG - call msg - .text "wrlba - Track " - .db 0 - ld a,(DRIVETRK+1) - call a_hex - ld a,(DRIVETRK) - call a_hex - call msg - .db ", Sector ",0 - ld a,(DRIVESEC) - call a_hex - call msg - .db CR,LF,0 -;END DEBUG - RET -; -;******************************************************** -;ie Drive READY if 01000000 -; -IDEwaitnotbusy: ld B,0FFH - ld A,0FFH ;Delay, must be above 80H for 4MHz Z80. Leave longer for slower drives - ld (DELAYStore),a - -MoreWait: ld E,REGstatus ;wait for RDY bit to be set - CALL IDErd8D - ld A,D - and 11000000B - xor 01000000B - jp z,DoneNotBusy - DJNZ MoreWait - ld a,(DELAYStore) ;Check timeout delay - dec A - ld (DELAYStore),a - jp nz,MoreWait - scf ;Set carry to indicqate an error - ret -DoneNotBusy: or A ;Clear carry it indicate no error - RET -; -;Wait for the drive to be ready to transfer data. -;Returns the drive's status in Acc -; -IDEwaitdrq: ld B,0FFH - ld A,0FFH ;Delay, must be above 80H for 4MHz Z80. Leave longer for slower drives - ld (DELAYStore),a - -MoreDRQ: ld E,REGstatus ;wait for DRQ bit to be set - CALL IDErd8D - ld A,D - and 10001000B - cp 00001000B - jp z,DoneDRQ - DJNZ MoreDRQ - ld a,(DELAYStore) ;Check timeout delay - dec A - ld (DELAYStore),a - jp nz,MoreDRQ - scf ;Set carry to indicate error - RET -DoneDRQ: OR A ;Clear carry - RET -; -;******************************************************** -; Low Level 8 bit R/W to the drive controller. These are -; the routines that talk directly to the drive controller -; registers, via the 8255 chip. Note the 16 bit I/O to -; the drive (which is only for SEC R/W) is done directly -; in the read/write functions for speed reasons. -; -; READ 8 bits from IDE register in [E], return info in [D] -; -IDErd8D: ld A,E - OUT (IDEportC),a ;drive address onto control lines - - OR IDErdline ;RD pulse pin (40H) - OUT (IDEportC),a ;assert read pin - - IN a,(IDEportA) - ld D,A ;return with data in [D] - - xor A - OUT (IDEportC),a ;Zero all port C lines - ret -; -; WRITE Data in [D] to IDE register in [E] -; -IDEwr8D: ld A,WRITEcfg8255 ;Set 8255 to write mode - OUT (IDEportCtrl),a - - ld A,D ;Get data put it in 8255 A port - OUT (IDEportA),a - - ld A,E ;select IDE register - OUT (IDEportC),a - - OR IDEwrline ;lower WR line - OUT (IDEportC),a - NOP - - xor A ;Deselect all lines including WR line - OUT (IDEportC),a - - ld A,READcfg8255 ;Config 8255 chip, read mode on return - OUT (IDEportCtrl),a - RET - - -SHOWerrors: call msg - .TEXT "SHOWerrors called" - .db CR,LF,0 - - .page -;******************************************************** -; Input/Output devices. For now, just call the TTY -; functions, but later I'll add iobyte support. -; -CONST: jp ttystat -CONIN: jp ttyin -CONOUT: jp ttyout -; -;******************************************************** -; Message output subroutines. msghl will print the null- -; terminated message pointed to by HL. msg will -; print the null terminated string immediately following -; the "call MSG" line. -; -msg: ex (sp),hl - call msghl - ex (sp),hl - ret -; -msghl: ld a,(hl) - or a - ret z - ld c,a - call CONOUT - inc hl - jr msghl -; -;******************************************************** -; Display the contents of A as two hex digits -; -a_hex: push af - rrca - rrca - rrca - rrca - call ahex2 - pop af -ahex2: and 0fh - add a,90h - daa - adc a,40h - daa - ld c,a - jr ttyout -; -;******************************************************** -; Do a CR/LF -; -crlf: ld c,CR - call ttyout - ld c,LF - jr ttyout - .page -; -;******************************************************** -; Other I/O devices. Make them all do nothing for now. -; -LIST: jp ttyout -PUNCH: ret -READER: ld a,EOF - ret -LISTST: ld a,TRUE - ret - -#include "ccs2710.inc" - - - -; stuff from bios.mac - -InBufferDkTrkSec: ;Variables for physical sector - ; currently in Disk$Buffer in memory -InBufferDisk: db 0 ; These are moved and compared -InBufferTrack: dw 0 ; as a group, so do not alter -InBufferSector: db 0 ; these lines. -; -DataInDiskBuffer: db 0 ;When nonzero, the disk buffer has - ; data from the disk in it. -MustWriteBuffer: db 0 ;Nonzero when data has been - ; written into Disk$Buffer but - ; not yet written out to disk - -DMAAddress: dw 0 - -WriteType db 0 - - ;These are the values handed over by the BDOS - ; when it calls the WRITE operation. - ;The allocated/unallocated indicates whether the - ; BDOS is set to write to an unallocated allocation - ; block (it only indicates this for the first - ; 128-byte sector write) or to an allocation block - ; that has already been allocated to a file. - ;The BDOS also indicates if it is set to write to - ; the file directory. - ; -WriteAllocated equ 0 -WriteDirectory equ 1 -WriteUnallocated equ 2 - -; -;Variables for selected disk, track, and sector -; (Selected by SELDSK, SETTRK,n and SETSEC) -; -; Note that these are in a specific order, so do not change -; the size nor order without checking where other pieces of -; code are affected! -; -SelectedDkTrkSec: -SelectedDisk: db 0 ; These are moved and -SelectedTrack: dw 0 ; compared as a group so -SelectedSector: db 0 ; do not alter order. -SelectedPhysicalSector: db 0 ;Selected physical sector derived - ; from selected (CP/M) sector by - ; shifting it right the number of - ; bits specified by - ; Sector$Bit$Shift -; -SelectedDiskType: db 0 ;Set by SELDSK to indicate either - ; 8" or 5 1/4" floppy -SelectedDiskDeblock: db 0 ;Set by SELDSK to indicate whether - ; deblocking is required. - -UnallocatedDkTrkSec: ;Parameters for writing to a previously - ; unallocated allocation block. -UnallocatedDisk: db 0 ; These are moved and compared -UnallocatedTrack: dw 0 ; as a group so do not alter -UnallocatedSector: db 0 ; these lines. - -UnallocatedRecordCount: db 0 ;Number of unallocated "records" - ; in current previously unallocated - ; allocation block. - -DiskErrorFlag: db 0 ;Nonzero to indicate an error - ; that could not be recovered - ; by the disk drivers. BDOS will - ; output a "bad sector" message. - -; -;Flags used inside the deblocking code - -MustPrereadSector: db 0 ;Nonzero if a physical sector must - ; be read into the disk buffer - ; either before a write to an - ; allocated block can occur, or - ; for a normal CP/M 128-byte - ; sector read -ReadOperation: db 0 ;Nonzero when a CP/M 128-byte - ; sector is to be read -DeblockingRequired: db 0 ;Nonzero when the selected disk - ; needs deblocking (set in SELDSK) -DiskType: db 0 ;Indicates 8" or 5 1/4" floppy - ; selected (set in SELDSK). - - -; -; This is the actual sector size -; for the 5 1/4" mini-floppy diskettes. -; The 8" diskettes use 128-byte sectors. -; Declare the physical disk buffer for the -; 5 1/4" diskettes -; -; This is the low level buffer used to hold a sector of data. -; -PhysicalSectorSize equ 512 -DiskBuffer: ds PhysicalSectorSize -; -; Data written to, or read from, the mini-floppy drive is transferred -; via a physical buffer that is actually 512 bytes long (it was -; declared at the front of the BIOS and holds the "one-time" -; initialization code used for the cold boot procedure). -; -; The blocking/deblocking code attempts to minimize the amount -; of actual disk I/O by storing the disk, track, and physical sector -; currently residing in the Physical Buffer. If a read request is for -; a 128-byte CP/M "sector" that already is in the physical buffer, -; then no disk access occurs. -; -; -AllocationBlockSize equ 2048 -PhysicalSecPerTrack equ 18 -CPMSecPerPhysical equ PhysicalSectorSize/128 -CPMSecPerTrack equ CPMSecPerPhysical*PhysicalSecPerTrack -SectorMask equ CPMSecPerPhysical-1 -SectorBitShift equ 2 ;LOG2(CPM$Sec$Per$Physical) - - - -; stuff from MYIDE - -DELAYStore: DS 1 -DRIVESEC: db 0 -DRIVETRK: dw 0 - -; -; This MUST BE the last label! -; -BIOS_END .equ * - - .end diff --git a/branches/dgg/Applegate/ccs2710.inc b/branches/dgg/Applegate/ccs2710.inc deleted file mode 100644 index 4129733a..00000000 --- a/branches/dgg/Applegate/ccs2710.inc +++ /dev/null @@ -1,77 +0,0 @@ - .page -;******************************************************** -; These are I/O functions for the CCS 2710 four-port -; serial I/O board. -; -; Bob Applegate, 02/16/2008 -; -SIObase .equ 0E0H -; -SIODATA .equ SIObase -SIOBAUDL .equ SIObase ;also used for baud rate -SIOINTEN .equ SIObase+1 -SIOBAUDH .equ SIObase+1 ;ditto -SIOIDENT .equ SIObase+2 -SIOLCTRL .equ SIObase+3 -SIOMDMCT .equ SIObase+4 -SIOLSTAT .equ SIObase+5 -SIOMDMST .equ SIObase+6 -BAUD03 .equ 0180H ;divisor for 300 baud -BAUD12 .equ 060H ;1200 baud -BAUD_2400 .equ 030h ;2400 baud -BAUD96 .equ 00CH ;9600 baud -DATRDY .equ 01H ;rec'd data ready -TXMTY .equ 20H ;transmitter holding reg empty -HSMSK .equ 20H - -BAUD_RATE .equ BAUD_2400 - -; -; This function initializes the main console port for the -; default baud rate. -; -initser: ld a,0fH - out (SIOMDMCT),a - ld a,083H ;enable divisor latch access - out (SIOLCTRL),a - ld a,BAUD_RATE / 256 ;get hi byte - out (SIOBAUDH),a - ld a,BAUD_RATE % 256 ;get low byte - out (SIOBAUDL),a - ld a,03H ;8 data bits, one stop bit, no parity - out (SIOLCTRL),a - xor a ;clear acc - out (SIOINTEN),a ;disable ints - out (SIOLSTAT),a ;clear status - in a,(SIODATA) ;clear out any garbage in rec'd data reg - ret -; -; TTY output of character in C. Modifies A. -; -ttyout: IN A,(SIOLSTAT) ;was A,TTS, read status port - AND TXMTY ;check buffer empty bit - JR Z,ttyout ;branch if not empty - LD A,C - OUT (SIODATA),A ;was TTO,A, send out character - RET ;thassit -; -; Check to see if a character is ready to be read from the TTY. -; Returns TRUE (0ffh) in A is there is a character waiting, or -; FALSE (0) if there is nothing. -; -ttystat: IN A,(SIOLSTAT) ;was A,TTS - AND DATRDY - LD A,TRUE ;was FALSE - RET NZ - CPL - RET -; -; This gets the next character from the TTY and returns it in A. -; This will block if there is nothing waiting. -; -ttyin: IN A,(SIOLSTAT) ;read status reg - AND DATRDY ;look for data ready - JR Z,ttyin ;wait for char - IN a,(SIODATA) ;read character - RET - .page diff --git a/branches/dgg/Applegate/convert.py b/branches/dgg/Applegate/convert.py deleted file mode 100755 index 3b53fa25..00000000 --- a/branches/dgg/Applegate/convert.py +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/python -# Written by Douglas Goodall 17:25 Wed, Jan 30, 2013 -# load cpm.bin and bios.bin then jump - -import sys -import os -import serial - -# passing in a string either "12" or "0x12" -# return value is string of hex digits only (no 0x) -def safebyte(parm): - xyz = parm - myord = ord(xyz) - hexdata = hex(myord) - newstr = hexdata - if (hexdata[0] == '0'): - if(hexdata[1] == 'x'): - newstr = hexdata[2] - if(len(hexdata)>3): - newstr = newstr + hexdata[3] - return newstr - -# passing in a string either "1234" of "0x1234" -# return value is string of hex digits only (1234) (no 0x) -def safeword(parm): - xyz = parm - myint = int(xyz) - hexdata = hex(myint) - newstr = hexdata - if (hexdata[0] == '0'): - if(hexdata[1] == 'x'): - newstr = hexdata[2] - if(len(hexdata)>3): - newstr = newstr + hexdata[3] - if(len(hexdata)>4): - newstr = newstr + hexdata[4] - if(len(hexdata)>5): - newstr = newstr + hexdata[5] - return newstr - -def loadngo(filename): - statinfo = os.stat(filename) - filelen = statinfo.st_size - infile = open(filename,'rb') - filedata = infile.read() - infile.close() - outfile = open("cpm.trans","w") - -# ser = serial.Serial('/dev/cu.PL2303-0000201D', 19200, timeout=10) -# ser.write("\n\n") - outfile.write("sa400\n") -# print ser.read(12); - for x in range(1,filelen): - outfile.write(safebyte(filedata[x-1])) - outfile.write(" ") - outfile.write("\n") - outfile.close() -# print ser.read(12) -# ser.close() - -print "*******************************************************************" -print "loadcpm.py 1/30/2013 dwg - load&go S-100 CP/M using master-yoda ROM" -print "*******************************************************************" -#loadngo("cpm.bin") -ser = serial.Serial('/dev/cu.PL2303-0000201D', 19200, timeout=1) -ser.read(128) -ser.read(128) -ser.write("\n") -ser.close() -loadngo("cpm.bin") - diff --git a/branches/dgg/Applegate/cpm.trans b/branches/dgg/Applegate/cpm.trans deleted file mode 100644 index b6335325..00000000 --- a/branches/dgg/Applegate/cpm.trans +++ /dev/null @@ -1,2 +0,0 @@ -sa400 -c3 5c a7 c3 58 a7 7f 0 43 6f 70 79 72 69 67 68 74 20 31 39 37 39 20 28 63 29 20 62 79 20 44 69 67 69 74 61 6c 20 52 65 73 65 61 72 63 68 20 20 20 20 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 a4 0 0 5f e 2 c3 5 0 c5 cd 8c a4 c1 c9 3e d cd 92 a4 3e a c3 92 a4 3e 20 c3 92 a4 c5 cd 98 a4 e1 7e b7 c8 23 e5 cd 8c a4 e1 c3 ac a4 e d c3 5 0 5f e e c3 5 0 cd 5 0 32 ee ab 3c c9 e f c3 c3 a4 af 32 ed ab 11 cd ab c3 cb a4 e 10 c3 c3 a4 e 11 c3 c3 a4 e 12 c3 c3 a4 11 cd ab c3 df a4 e 13 c3 5 0 cd 5 0 b7 c9 e 14 c3 f4 a4 11 cd ab c3 f9 a4 e 15 c3 f4 a4 e 16 c3 c3 a4 e 17 c3 5 0 1e ff e 20 c3 5 0 cd 13 a5 87 87 87 87 21 ef ab b6 32 4 0 c9 3a ef ab 32 4 0 c9 fe 61 d8 fe 7b d0 e6 5f c9 3a ab ab b7 ca 96 a5 3a ef ab b7 3e 0 c4 bd a4 11 ac ab cd cb a4 ca 96 a5 3a bb ab 3d 32 cc ab 11 ac ab cd f9 a4 c2 96 a5 11 7 a4 21 80 0 6 80 cd 42 a8 21 ba ab 36 0 23 35 11 ac ab cd da a4 ca 96 a5 3a ef ab b7 c4 bd a4 21 8 a4 cd ac a4 cd c2 a5 ca a7 a5 cd dd a5 c3 82 a7 cd dd a5 cd 1a a5 e a 11 6 a4 cd 5 0 cd 29 a5 21 7 a4 46 23 78 b7 ca ba a5 7e cd 30 a5 77 5 c3 ab a5 77 21 8 a4 22 88 a4 c9 e b cd 5 0 b7 c8 e 1 cd 5 0 b7 c9 e 19 c3 5 0 11 80 0 e 1a c3 5 0 21 ab ab 7e b7 c8 36 0 af cd bd a4 11 ac ab cd ef a4 3a ef ab c3 bd a4 11 28 a7 21 0 ac 6 6 1a be c2 cf a7 13 23 5 c2 fd a5 c9 cd 98 a4 2a 8a a4 7e fe 20 ca 22 a6 b7 ca 22 a6 e5 cd 8c a4 e1 23 c3 f a6 3e 3f cd 8c a4 cd 98 a4 cd dd a5 c3 82 a7 1a b7 c8 fe 20 da 9 a6 c8 fe 3d c8 fe 5f c8 fe 2e c8 fe 3a c8 fe 3b c8 fe 3c c8 fe 3e c8 c9 1a b7 c8 fe 20 c0 13 c3 4f a6 85 6f d0 24 c9 3e 0 21 cd ab cd 59 a6 e5 e5 af 32 f0 ab 2a 88 a4 eb cd 4f a6 eb 22 8a a4 eb e1 1a b7 ca 89 a6 de 40 47 13 1a fe 3a ca 90 a6 1b 3a ef ab 77 c3 96 a6 78 32 f0 ab 70 13 6 8 cd 30 a6 ca b9 a6 23 fe 2a c2 a9 a6 36 3f c3 ab a6 77 13 5 c2 98 a6 cd 30 a6 ca c0 a6 13 c3 af a6 23 36 20 5 c2 b9 a6 6 3 fe 2e c2 e9 a6 13 cd 30 a6 ca e9 a6 23 fe 2a c2 d9 a6 36 3f c3 db a6 77 13 5 c2 c8 a6 cd 30 a6 ca f0 a6 13 c3 df a6 23 36 20 5 c2 e9 a6 6 3 23 36 0 5 c2 f2 a6 eb 22 88 a4 e1 1 b 0 23 7e fe 3f c2 9 a7 4 d c2 1 a7 78 b7 c9 44 49 52 20 45 52 41 20 54 59 50 45 53 41 56 45 52 45 4e 20 55 53 45 52 0 16 0 0 0 0 21 10 a7 e 0 79 fe 6 d0 11 ce ab 6 4 1a be c2 4f a7 13 23 5 c2 3c a7 1a fe 20 c2 54 a7 79 c9 23 5 c2 4f a7 c c3 33 a7 af 32 7 a4 31 ab ab c5 79 1f 1f 1f 1f e6 f 5f cd 15 a5 cd b8 a4 32 ab ab c1 79 e6 f 32 ef ab cd bd a4 3a 7 a4 b7 c2 98 a7 31 ab ab cd 98 a4 cd d0 a5 c6 41 cd 8c a4 3e 3e cd 8c a4 cd 39 a5 11 80 0 cd d8 a5 cd d0 a5 32 ef ab cd 5e a6 c4 9 a6 3a f0 ab b7 c2 a5 aa cd 2e a7 21 c1 a7 5f 16 0 19 19 7e 23 66 6f e9 77 a8 1f a9 5d a9 ad a9 10 aa 8e aa a5 aa 21 f3 76 22 0 a4 21 0 a4 e9 1 df a7 c3 a7 a4 52 65 61 64 20 65 72 72 6f 72 0 1 f0 a7 c3 a7 a4 4e 6f 20 66 69 6c 65 0 cd 5e a6 3a f0 ab b7 c2 9 a6 21 ce ab 1 b 0 7e fe 20 ca 33 a8 23 d6 30 fe a d2 9 a6 57 78 e6 e0 c2 9 a6 78 7 7 7 80 da 9 a6 80 da 9 a6 82 da 9 a6 47 d c2 8 a8 c9 7e fe 20 c2 9 a6 23 d c2 33 a8 78 c9 6 3 7e 12 23 13 5 c2 42 a8 c9 21 80 0 81 cd 59 a6 7e c9 af 32 cd ab 3a f0 ab b7 c8 3d 21 ef ab be c8 c3 bd a4 3a f0 ab b7 c8 3d 21 ef ab be c8 3a ef ab c3 bd a4 cd 5e a6 cd 54 a8 21 ce ab 7e fe 20 c2 8f a8 6 b 36 3f 23 5 c2 88 a8 1e 0 d5 cd e9 a4 cc ea a7 ca 1b a9 3a ee ab f f f e6 60 4f 3e a cd 4b a8 17 da f a9 d1 7b 1c d5 e6 3 f5 c2 cc a8 cd 98 a4 c5 cd d0 a5 c1 c6 41 cd 92 a4 3e 3a cd 92 a4 c3 d4 a8 cd a2 a4 3e 3a cd 92 a4 cd a2 a4 6 1 78 cd 4b a8 e6 7f fe 20 c2 f9 a8 f1 f5 fe 3 c2 f7 a8 3e 9 cd 4b a8 e6 7f fe 20 ca e a9 3e 20 cd 92 a4 4 78 fe c d2 e a9 fe 9 c2 d9 a8 cd a2 a4 c3 d9 a8 f1 cd c2 a5 c2 1b a9 cd e4 a4 c3 98 a8 d1 c3 86 ab cd 5e a6 fe b c2 42 a9 1 52 a9 cd a7 a4 cd 39 a5 21 7 a4 35 c2 82 a7 23 7e fe 59 c2 82 a7 23 22 88 a4 cd 54 a8 11 cd ab cd ef a4 3c cc ea a7 c3 86 ab 41 6c 6c 20 28 79 2f 6e 29 3f 0 cd 5e a6 c2 9 a6 cd 54 a8 cd d0 a4 ca a7 a9 cd 98 a4 21 f1 ab 36 ff 21 f1 ab 7e fe 80 da 87 a9 e5 cd fe a4 e1 c2 a0 a9 af 77 34 21 80 0 cd 59 a6 7e fe 1a ca 86 ab cd 8c a4 cd c2 a5 c2 86 ab c3 74 a9 3d ca 86 ab cd d9 a7 cd 66 a8 c3 9 a6 cd f8 a7 f5 cd 5e a6 c2 9 a6 cd 54 a8 11 cd ab d5 cd ef a4 d1 cd 9 a5 ca fb a9 af 32 ed ab f1 6f 26 0 29 11 0 1 7c b5 ca f1 a9 2b e5 21 80 0 19 e5 cd d8 a5 11 cd ab cd 4 a5 d1 e1 c2 fb a9 c3 d4 a9 11 cd ab cd da a4 3c c2 1 aa 1 7 aa cd a7 a4 cd d5 a5 c3 86 ab 4e 6f 20 73 70 61 63 65 0 cd 5e a6 c2 9 a6 3a f0 ab f5 cd 54 a8 cd e9 a4 c2 79 aa 21 cd ab 11 dd ab 6 10 cd 42 a8 2a 88 a4 eb cd 4f a6 fe 3d ca 3f aa fe 5f c2 73 aa eb 23 22 88 a4 cd 5e a6 c2 73 aa f1 47 21 f0 ab 7e b7 ca 59 aa b8 70 c2 73 aa 70 af 32 cd ab cd e9 a4 ca 6d aa 11 cd ab cd e a5 c3 86 ab cd ea a7 c3 86 ab cd 66 a8 c3 9 a6 1 82 aa cd a7 a4 c3 86 ab 46 69 6c 65 20 65 78 69 73 74 73 0 cd f8 a7 fe 10 d2 9 a6 5f 3a ce ab fe 20 ca 9 a6 cd 15 a5 c3 89 ab cd f5 a5 3a ce ab fe 20 c2 c4 aa 3a f0 ab b7 ca 89 ab 3d 32 ef ab cd 29 a5 cd bd a4 c3 89 ab 11 d6 ab 1a fe 20 c2 9 a6 d5 cd 54 a8 d1 21 83 ab cd 40 a8 cd d0 a4 ca 6b ab 21 0 1 e5 eb cd d8 a5 11 cd ab cd f9 a4 c2 1 ab e1 11 80 0 19 11 0 a4 7d 93 7c 9a d2 71 ab c3 e1 aa e1 3d c2 71 ab cd 66 a8 cd 5e a6 21 f0 ab e5 7e 32 cd ab 3e 10 cd 60 a6 e1 7e 32 dd ab af 32 ed ab 11 5c 0 21 cd ab 6 21 cd 42 a8 21 8 a4 7e b7 ca 3e ab fe 20 ca 3e ab 23 c3 30 ab 6 0 11 81 0 7e 12 b7 ca 4f ab 4 23 13 c3 43 ab 78 32 80 0 cd 98 a4 cd d5 a5 cd 1a a5 cd 0 1 31 ab ab cd 29 a5 cd bd a4 c3 82 a7 cd 66 a8 c3 9 a6 1 7a ab cd a7 a4 c3 86 ab 42 61 64 20 6c 6f 61 64 0 43 4f 4d cd 66 a8 cd 5e a6 3a ce ab d6 20 21 f0 ab b6 c2 9 a6 c3 82 a7 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 24 24 24 20 20 20 20 20 53 55 42 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 20 20 20 20 20 20 20 20 20 20 0 0 0 0 0 20 20 20 20 20 20 20 20 20 20 20 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 16 0 0 0 0 c3 11 ac 99 ac a5 ac ab ac b1 ac eb 22 43 af eb 7b 32 d6 b9 21 0 0 22 45 af 39 22 f af 31 41 af af 32 e0 b9 32 de b9 21 74 b9 e5 79 fe 29 d0 4b 21 47 ac 5f 16 0 19 19 5e 23 56 2a 43 af eb e9 3 ba c8 ae 90 ad ce ae 12 ba f ba d4 ae ed ae f3 ae f8 ae e1 ad fe ae 7e b8 83 b8 45 b8 9c b8 a5 b8 ab b8 c8 b8 d7 b8 e0 b8 e6 b8 ec b8 f5 b8 fe b8 4 b9 a b9 11 b9 2c b1 17 b9 1d b9 26 b9 2d b9 41 b9 47 b9 4d b9 e b8 53 b9 4 af 4 af 9b b9 21 ca ac cd e5 ac fe 3 ca 0 0 c9 21 d5 ac c3 b4 ac 21 e1 ac c3 b4 ac 21 dc ac cd e5 ac c3 0 0 42 64 6f 73 20 45 72 72 20 4f 6e 20 20 3a 20 24 42 61 64 20 53 65 63 74 6f 72 24 53 65 6c 65 63 74 24 46 69 6c 65 20 52 2f 4f 24 e5 cd c9 ad 3a 42 af c6 41 32 c6 ac 1 ba ac cd d3 ad c1 cd d3 ad 21 e af 7e 36 0 b7 c0 c3 9 ba cd fb ac cd 14 ad d8 f5 4f cd 90 ad f1 c9 fe d c8 fe a c8 fe 9 c8 fe 8 c8 fe 20 c9 3a e af b7 c2 45 ad cd 6 ba e6 1 c8 cd 9 ba fe 13 c2 42 ad cd 9 ba fe 3 ca 0 0 af c9 32 e af 3e 1 c9 3a a af b7 c2 62 ad c5 cd 23 ad c1 c5 cd c ba c1 c5 3a d af b7 c4 f ba c1 79 21 c af fe 7f c8 34 fe 20 d0 35 7e b7 c8 79 fe 8 c2 79 ad 35 c9 fe a c0 36 0 c9 79 cd 14 ad d2 90 ad f5 e 5e cd 48 ad f1 f6 40 4f 79 fe 9 c2 48 ad e 20 cd 48 ad 3a c af e6 7 c2 96 ad c9 cd ac ad e 20 cd c ba e 8 c3 c ba e 23 cd 48 ad cd c9 ad 3a c af 21 b af be d0 e 20 cd 48 ad c3 b9 ad e d cd 48 ad e a c3 48 ad a fe 24 c8 3 c5 4f cd 90 ad c1 c3 d3 ad 3a c af 32 b af 2a 43 af 4e 23 e5 6 0 c5 e5 cd fb ac e6 7f e1 c1 fe d ca c1 ae fe a ca c1 ae fe 8 c2 16 ae 78 b7 ca ef ad 5 3a c af 32 a af c3 70 ae fe 7f c2 26 ae 78 b7 ca ef ad 7e 5 2b c3 a9 ae fe 5 c2 37 ae c5 e5 cd c9 ad af 32 b af c3 f1 ad fe 10 c2 48 ae e5 21 d af 3e 1 96 77 e1 c3 ef ad fe 18 c2 5f ae e1 3a b af 21 c af be d2 e1 ad 35 cd a4 ad c3 4e ae fe 15 c2 6b ae cd b1 ad e1 c3 e1 ad fe 12 c2 a6 ae c5 cd b1 ad c1 e1 e5 c5 78 b7 ca 8a ae 23 4e 5 c5 e5 cd 7f ad e1 c1 c3 78 ae e5 3a a af b7 ca f1 ad 21 c af 96 32 a af cd a4 ad 21 a af 35 c2 99 ae c3 f1 ad 23 77 4 c5 e5 4f cd 7f ad e1 c1 7e fe 3 78 c2 bd ae fe 1 ca 0 0 b9 da ef ad e1 70 e d c3 48 ad cd 6 ad c3 1 af cd 15 ba c3 1 af 79 3c ca e0 ae 3c ca 6 ba c3 c ba cd 6 ba b7 ca 91 b9 cd 9 ba c3 1 af 3a 3 0 c3 1 af 21 3 0 71 c9 eb 4d 44 c3 d3 ad cd 23 ad 32 45 af c9 3e 1 c3 1 af 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 b ac 5e 23 56 eb e9 c d c8 1a 77 13 23 c3 50 af 3a 42 af 4f cd 1b ba 7c b5 c8 5e 23 56 23 22 b3 b9 23 23 22 b5 b9 23 23 22 b7 b9 23 23 eb 22 d0 b9 21 b9 b9 e 8 cd 4f af 2a bb b9 eb 21 c1 b9 e f cd 4f af 2a c6 b9 7c 21 dd b9 36 ff b7 ca 9d af 36 0 3e ff b7 c9 cd 18 ba af 2a b5 b9 77 23 77 2a b7 b9 77 23 77 c9 cd 27 ba c3 bb af cd 2a ba b7 c8 21 9 ac c3 4a af 2a ea b9 e 2 cd ea b0 22 e5 b9 22 ec b9 21 e5 b9 4e 23 46 2a b7 b9 5e 23 56 2a b5 b9 7e 23 66 6f 79 93 78 9a d2 fa af e5 2a c1 b9 7b 95 5f 7a 9c 57 e1 2b c3 e4 af e5 2a c1 b9 19 da f b0 79 95 78 9c da f b0 eb e1 23 c3 fa af e1 c5 d5 e5 eb 2a ce b9 19 44 4d cd 1e ba d1 2a b5 b9 73 23 72 d1 2a b7 b9 73 23 72 c1 79 93 4f 78 9a 47 2a d0 b9 eb cd 30 ba 4d 44 c3 21 ba 21 c3 b9 4e 3a e3 b9 b7 1f d c2 45 b0 47 3e 8 96 4f 3a e2 b9 d ca 5c b0 b7 17 c3 53 b0 80 c9 2a 43 af 11 10 0 19 9 3a dd b9 b7 ca 71 b0 6e 26 0 c9 9 5e 23 56 eb c9 cd 3e b0 4f 6 0 cd 5e b0 22 e5 b9 c9 2a e5 b9 7d b4 c9 3a c3 b9 2a e5 b9 29 3d c2 90 b0 22 e7 b9 3a c4 b9 4f 3a e3 b9 a1 b5 6f 22 e5 b9 c9 2a 43 af 11 c 0 19 c9 2a 43 af 11 f 0 19 eb 21 11 0 19 c9 cd ae b0 7e 32 e3 b9 eb 7e 32 e1 b9 cd a6 b0 3a c5 b9 a6 32 e2 b9 c9 cd ae b0 3a d5 b9 fe 2 c2 de b0 af 4f 3a e3 b9 81 77 eb 3a e1 b9 77 c9 c d c8 7c b7 1f 67 7d 1f 6f c3 eb b0 e 80 2a b9 b9 af 86 23 d c2 fd b0 c9 c d c8 29 c3 5 b1 c5 3a 42 af 4f 21 1 0 cd 4 b1 c1 79 b5 6f 78 b4 67 c9 2a ad b9 3a 42 af 4f cd ea b0 7d e6 1 c9 21 ad b9 4e 23 46 cd b b1 22 ad b9 2a c8 b9 23 eb 2a b3 b9 73 23 72 c9 cd 5e b1 11 9 0 19 7e 17 d0 21 f ac c3 4a af cd 1e b1 c8 21 d ac c3 4a af 2a b9 b9 3a e9 b9 85 6f d0 24 c9 2a 43 af 11 e 0 19 7e c9 cd 69 b1 36 0 c9 cd 69 b1 f6 80 77 c9 2a ea b9 eb 2a b3 b9 7b 96 23 7a 9e c9 cd 7f b1 d8 13 72 2b 73 c9 7b 95 6f 7a 9c 67 c9 e ff 2a ec b9 eb 2a cc b9 cd 95 b1 d0 c5 cd f7 b0 2a bd b9 eb 2a ec b9 19 c1 c ca c4 b1 be c8 cd 7f b1 d0 cd 2c b1 c9 77 c9 cd 9c b1 cd e0 b1 e 1 cd b8 af c3 da b1 cd e0 b1 cd b2 af 21 b1 b9 c3 e3 b1 21 b9 b9 4e 23 46 c3 24 ba 2a b9 b9 eb 2a b1 b9 e 80 c3 4f af 21 ea b9 7e 23 be c0 3c c9 21 ff ff 22 ea b9 c9 2a c8 b9 eb 2a ea b9 23 22 ea b9 cd 95 b1 d2 19 b2 c3 fe b1 3a ea b9 e6 3 6 5 87 5 c2 20 b2 32 e9 b9 b7 c0 c5 cd c3 af cd d4 b1 c1 c3 9e b1 79 e6 7 3c 5f 57 79 f f f e6 1f 4f 78 87 87 87 87 87 b1 4f 78 f f f e6 1f 47 2a bf b9 9 7e 7 1d c2 56 b2 c9 d5 cd 35 b2 e6 fe c1 b1 f 15 c2 64 b2 77 c9 cd 5e b1 11 10 0 19 c5 e 11 d1 d c8 d5 3a dd b9 b7 ca 88 b2 c5 e5 4e 6 0 c3 8e b2 d c5 4e 23 46 e5 79 b0 ca 9d b2 2a c6 b9 7d 91 7c 98 d4 5c b2 e1 23 c1 c3 75 b2 2a c6 b9 e 3 cd ea b0 23 44 4d 2a bf b9 36 0 23 b 78 b1 c2 b1 b2 2a ca b9 eb 2a bf b9 73 23 72 cd a1 af 2a b3 b9 36 3 23 36 0 cd fe b1 e ff cd 5 b2 cd f5 b1 c8 cd 5e b1 3e e5 be ca d2 b2 3a 41 af be c2 f6 b2 23 7e d6 24 c2 f6 b2 3d 32 45 af e 1 cd 6b b2 cd 8c b1 c3 d2 b2 3a d4 b9 c3 1 af c5 f5 3a c5 b9 2f 47 79 a0 4f f1 a0 91 e6 1f c1 c9 3e ff 32 d4 b9 21 d8 b9 71 2a 43 af 22 d9 b9 cd fe b1 cd a1 af e 0 cd 5 b2 cd f5 b1 ca 94 b3 2a d9 b9 eb 1a fe e5 ca 4a b3 d5 cd 7f b1 d1 d2 94 b3 cd 5e b1 3a d8 b9 4f 6 0 79 b7 ca 83 b3 1a fe 3f ca 7c b3 78 fe d ca 7c b3 fe c 1a ca 73 b3 96 e6 7f c2 2d b3 c3 7c b3 c5 4e cd 7 b3 c1 c2 2d b3 13 23 4 d c3 53 b3 3a ea b9 e6 3 32 45 af 21 d4 b9 7e 17 d0 af 77 c9 cd fe b1 3e ff c3 1 af cd 54 b1 e c cd 18 b3 cd f5 b1 c8 cd 44 b1 cd 5e b1 36 e5 e 0 cd 6b b2 cd c6 b1 cd 2d b3 c3 a4 b3 50 59 79 b0 ca d1 b3 b d5 c5 cd 35 b2 1f d2 ec b3 c1 d1 2a c6 b9 7b 95 7a 9c d2 f4 b3 13 c5 d5 42 4b cd 35 b2 1f d2 ec b3 d1 c1 c3 c0 b3 17 3c cd 64 b2 e1 d1 c9 79 b0 c2 c0 b3 21 0 0 c9 e 0 1e 20 d5 6 0 2a 43 af 9 eb cd 5e b1 c1 cd 4f af cd c3 af c3 c6 b1 cd 54 b1 e c cd 18 b3 2a 43 af 7e 11 10 0 19 77 cd f5 b1 c8 cd 44 b1 e 10 1e c cd 1 b4 cd 2d b3 c3 27 b4 e c cd 18 b3 cd f5 b1 c8 e 0 1e c cd 1 b4 cd 2d b3 c3 40 b4 e f cd 18 b3 cd f5 b1 c8 cd a6 b0 7e f5 e5 cd 5e b1 eb 2a 43 af e 20 d5 cd 4f af cd 78 b1 d1 21 c 0 19 4e 21 f 0 19 46 e1 f1 77 79 be 78 ca 8b b4 3e 0 da 8b b4 3e 80 2a 43 af 11 f 0 19 77 c9 7e 23 b6 2b c0 1a 77 13 23 1a 77 1b 2b c9 af 32 45 af 32 ea b9 32 eb b9 cd 1e b1 c0 cd 69 b1 e6 80 c0 e f cd 18 b3 cd f5 b1 c8 1 10 0 cd 5e b1 9 eb 2a 43 af 9 e 10 3a dd b9 b7 ca e8 b4 7e b7 1a c2 db b4 77 b7 c2 e1 b4 7e 12 be c2 1f b5 c3 fd b4 cd 94 b4 eb cd 94 b4 eb 1a be c2 1f b5 13 23 1a be c2 1f b5 d 13 23 d c2 cd b4 1 ec ff 9 eb 9 1a be da 17 b5 77 1 3 0 9 eb 9 7e 12 3e ff 32 d2 b9 c3 10 b4 21 45 af 35 c9 cd 54 b1 2a 43 af e5 21 ac b9 22 43 af e 1 cd 18 b3 cd f5 b1 e1 22 43 af c8 eb 21 f 0 19 e 11 af 77 23 d c2 46 b5 21 d 0 19 77 cd 8c b1 cd fd b3 c3 78 b1 af 32 d2 b9 cd a2 b4 cd f5 b1 c8 2a 43 af 1 c 0 9 7e 3c e6 1f 77 ca 83 b5 47 3a c5 b9 a0 21 d2 b9 a6 ca 8e b5 c3 ac b5 1 2 0 9 34 7e e6 f ca b6 b5 e f cd 18 b3 cd f5 b1 c2 ac b5 3a d3 b9 3c ca b6 b5 cd 24 b5 cd f5 b1 ca b6 b5 c3 af b5 cd 5a b4 cd bb b0 af c3 1 af cd 5 af c3 78 b1 3e 1 32 d5 b9 3e ff 32 d3 b9 cd bb b0 3a e3 b9 21 e1 b9 be da e6 b5 fe 80 c2 fb b5 cd 5a b5 af 32 e3 b9 3a 45 af b7 c2 fb b5 cd 77 b0 cd 84 b0 ca fb b5 cd 8a b0 cd d1 af cd b2 af c3 d2 b0 c3 5 af 3e 1 32 d5 b9 3e 0 32 d3 b9 cd 54 b1 2a 43 af cd 47 b1 cd bb b0 3a e3 b9 fe 80 d2 5 af cd 77 b0 cd 84 b0 e 0 c2 6e b6 cd 3e b0 32 d7 b9 1 0 0 b7 ca 3b b6 4f b cd 5e b0 44 4d cd be b3 7d b4 c2 48 b6 3e 2 c3 1 af 22 e5 b9 eb 2a 43 af 1 10 0 9 3a dd b9 b7 3a d7 b9 ca 64 b6 cd 64 b1 73 c3 6c b6 4f 6 0 9 9 73 23 72 e 2 3a 45 af b7 c0 c5 cd 8a b0 3a d5 b9 3d 3d c2 bb b6 c1 c5 79 3d 3d c2 bb b6 e5 2a b9 b9 57 77 23 14 f2 8c b6 cd e0 b1 2a e7 b9 e 2 22 e5 b9 c5 cd d1 af c1 cd b8 af 2a e5 b9 e 0 3a c4 b9 47 a5 b8 23 c2 9a b6 e1 22 e5 b9 cd da b1 cd d1 af c1 c5 cd b8 af c1 3a e3 b9 21 e1 b9 be da d2 b6 77 34 e 2 0 0 21 0 0 f5 cd 69 b1 e6 7f 77 f1 fe 7f c2 0 b7 3a d5 b9 fe 1 c2 0 b7 cd d2 b0 cd 5a b5 21 45 af 7e b7 c2 fe b6 3d 32 e3 b9 36 0 c3 d2 b0 af 32 d5 b9 c5 2a 43 af eb 21 21 0 19 7e e6 7f f5 7e 17 23 7e 17 e6 1f 4f 7e 1f 1f 1f 1f e6 f 47 f1 23 6e 2c 2d 2e 6 c2 8b b7 21 20 0 19 77 21 c 0 19 79 96 c2 47 b7 21 e 0 19 78 96 e6 7f ca 7f b7 c5 d5 cd a2 b4 d1 c1 2e 3 3a 45 af 3c ca 84 b7 21 c 0 19 71 21 e 0 19 70 cd 51 b4 3a 45 af 3c c2 7f b7 c1 c5 2e 4 c ca 84 b7 cd 24 b5 2e 5 3a 45 af 3c ca 84 b7 c1 af c3 1 af e5 cd 69 b1 36 c0 e1 c1 7d 32 45 af c3 78 b1 e ff cd 3 b7 cc c1 b5 c9 e 0 cd 3 b7 cc 3 b6 c9 eb 19 4e 6 0 21 c 0 19 7e f e6 80 81 4f 3e 0 88 47 7e f e6 f 80 47 21 e 0 19 7e 87 87 87 87 f5 80 47 f5 e1 7d e1 b5 e6 1 c9 e c cd 18 b3 2a 43 af 11 21 0 19 e5 72 23 72 23 72 cd f5 b1 ca c b8 cd 5e b1 11 f 0 cd a5 b7 e1 e5 5f 79 96 23 78 9e 23 7b 9e da 6 b8 73 2b 70 2b 71 cd 2d b3 c3 e4 b7 e1 c9 2a 43 af 11 20 0 cd a5 b7 21 21 0 19 71 23 70 23 77 c9 2a af b9 3a 42 af 4f cd ea b0 e5 eb cd 59 af e1 cc 47 af 7d 1f d8 2a af b9 4d 44 cd b b1 22 af b9 c3 a3 b2 3a d6 b9 21 42 af be c8 77 c3 21 b8 3e ff 32 de b9 2a 43 af 7e e6 1f 3d 32 d6 b9 fe 1e d2 75 b8 3a 42 af 32 df b9 7e 32 e0 b9 e6 e0 77 cd 45 b8 3a 41 af 2a 43 af b6 77 c9 3e 22 c3 1 af 21 0 0 22 ad b9 22 af b9 af 32 42 af 21 80 0 22 b1 b9 cd da b1 c3 21 b8 cd 72 b1 cd 51 b8 c3 51 b4 cd 51 b8 c3 a2 b4 e 0 eb 7e fe 3f ca c2 b8 cd a6 b0 7e fe 3f c4 72 b1 cd 51 b8 e f cd 18 b3 c3 e9 b1 2a d9 b9 22 43 af cd 51 b8 cd 2d b3 c3 e9 b1 cd 51 b8 cd 9c b3 c3 1 b3 cd 51 b8 c3 bc b5 cd 51 b8 c3 fe b5 cd 72 b1 cd 51 b8 c3 24 b5 cd 51 b8 cd 16 b4 c3 1 b3 2a af b9 c3 29 b9 3a 42 af c3 1 af eb 22 b1 b9 c3 da b1 2a bf b9 c3 29 b9 2a ad b9 c3 29 b9 cd 51 b8 cd 3b b4 c3 1 b3 2a bb b9 22 45 af c9 3a d6 b9 fe ff c2 3b b9 3a 41 af c3 1 af e6 1f 32 41 af c9 cd 51 b8 c3 93 b7 cd 51 b8 c3 9c b7 cd 51 b8 c3 d2 b7 2a 43 af 7d 2f 5f 7c 2f 2a af b9 a4 57 7d a3 5f 2a ad b9 eb 22 af b9 7d a3 6f 7c a2 67 22 ad b9 c9 3a de b9 b7 ca 91 b9 2a 43 af 36 0 3a e0 b9 b7 ca 91 b9 77 3a df b9 32 d6 b9 cd 45 b8 2a f af f9 2a 45 af 7d 44 c9 cd 51 b8 3e 2 32 d5 b9 e 0 cd 7 b7 cc 3 b6 c9 e5 0 0 0 0 80 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 0 c3 0 diff --git a/branches/dgg/Applegate/cpm22.asm b/branches/dgg/Applegate/cpm22.asm deleted file mode 100644 index 1a8b2766..00000000 --- a/branches/dgg/Applegate/cpm22.asm +++ /dev/null @@ -1,3746 +0,0 @@ -;************************************************************** -;* -;* C P / M version 2 . 2 -;* -;* Reconstructed from memory image on February 27, 1981 -;* -;* by Clark A. Calkins -;* -;************************************************************** -; -#include "tasm.inc" - -#include "cpm22.inc" - -; -;IOBYTE EQU 3 ;i/o definition byte. -;TDRIVE EQU 4 ;current drive name and user number. -;ENTRY EQU 5 ;entry point for the cp/m bdos. -TFCB EQU 5CH ;default file control block. -TBUFF EQU 80H ;i/o buffer and command line storage. -TBASE EQU 100H ;transiant program storage area. -; -; Set control character equates. -; -CNTRLC EQU 3 ;control-c -CNTRLE EQU 05H ;control-e -BS EQU 08H ;backspace -TAB EQU 09H ;tab -LF EQU 0AH ;line feed -FF EQU 0CH ;form feed -CR EQU 0DH ;carriage return -CNTRLP EQU 10H ;control-p -CNTRLR EQU 12H ;control-r -CNTRLS EQU 13H ;control-s -CNTRLU EQU 15H ;control-u -CNTRLX EQU 18H ;control-x -CNTRLZ EQU 1AH ;control-z (end-of-file mark) -DEL EQU 7FH ;rubout -; -; Set origin for CP/M -; - ORG CCPBASE -; ORG (RAMSIZE-7)*1024 -; -CBASE: JP COMMAND ;execute command processor (ccp). - JP CLEARBUF ;entry to empty input buffer before starting ccp. - -; -; Standard cp/m ccp input buffer. Format is (max length), -; (actual length), (char #1), (char #2), (char #3), etc. -; -INBUFF: DEFB 127 ;length of input buffer. - DEFB 0 ;current length of contents. - TEXT "Copyright" - TEXT " 1979 (c) by Digital Research " - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -INPOINT:DEFW INBUFF+2 ;input line pointer -NAMEPNT:DEFW 0 ;input line pointer used for error message. Points to -; ;start of name in error. -; -; Routine to print (A) on the console. All registers used. -; -PRINT: LD E,A ;setup bdos call. - LD C,2 - JP ENTRY -; -; Routine to print (A) on the console and to save (BC). -; -PRINTB: PUSH BC - CALL PRINT - POP BC - RET -; -; Routine to send a carriage return, line feed combination -; to the console. -; -CRLF: LD A,CR - CALL PRINTB - LD A,LF - JP PRINTB -; -; Routine to send one space to the console and save (BC). -; -SPACE: LD A,' ' - JP PRINTB -; -; Routine to print character string pointed to be (BC) on the -; console. It must terminate with a null byte. -; -PLINE: PUSH BC - CALL CRLF - POP HL -PLINE2: LD A,(HL) - OR A - RET Z - INC HL - PUSH HL - CALL PRINT - POP HL - JP PLINE2 -; -; Routine to reset the disk system. -; -RESDSK: LD C,13 - JP ENTRY -; -; Routine to select disk (A). -; -DSKSEL: LD E,A - LD C,14 - JP ENTRY -; -; Routine to call bdos and save the return code. The zero -; flag is set on a return of 0ffh. -; -ENTRY1: CALL ENTRY - LD (RTNCODE),A ;save return code. - INC A ;set zero if 0ffh returned. - RET -; -; Routine to open a file. (DE) must point to the FCB. -; -OPEN: LD C,15 - JP ENTRY1 -; -; Routine to open file at (FCB). -; -OPENFCB:XOR A ;clear the record number byte at fcb+32 - LD (FCB+32),A - LD DE,FCB - JP OPEN -; -; Routine to close a file. (DE) points to FCB. -; -CLOSE: LD C,16 - JP ENTRY1 -; -; Routine to search for the first file with ambigueous name -; (DE). -; -SRCHFST:LD C,17 - JP ENTRY1 -; -; Search for the next ambigeous file name. -; -SRCHNXT:LD C,18 - JP ENTRY1 -; -; Search for file at (FCB). -; -SRCHFCB:LD DE,FCB - JP SRCHFST -; -; Routine to delete a file pointed to by (DE). -; -DELETE: LD C,19 - JP ENTRY -; -; Routine to call the bdos and set the zero flag if a zero -; status is returned. -; -ENTRY2: CALL ENTRY - OR A ;set zero flag if appropriate. - RET -; -; Routine to read the next record from a sequential file. -; (DE) points to the FCB. -; -RDREC: LD C,20 - JP ENTRY2 -; -; Routine to read file at (FCB). -; -READFCB:LD DE,FCB - JP RDREC -; -; Routine to write the next record of a sequential file. -; (DE) points to the FCB. -; -WRTREC: LD C,21 - JP ENTRY2 -; -; Routine to create the file pointed to by (DE). -; -CREATE: LD C,22 - JP ENTRY1 -; -; Routine to rename the file pointed to by (DE). Note that -; the new name starts at (DE+16). -; -RENAM: LD C,23 - JP ENTRY -; -; Get the current user code. -; -GETUSR: LD E,0FFH -; -; Routne to get or set the current user code. -; If (E) is FF then this is a GET, else it is a SET. -; -GETSETUC: LD C,32 - JP ENTRY -; -; Routine to set the current drive byte at (TDRIVE). -; -SETCDRV:CALL GETUSR ;get user number - ADD A,A ;and shift into the upper 4 bits. - ADD A,A - ADD A,A - ADD A,A - LD HL,CDRIVE ;now add in the current drive number. - OR (HL) - LD (TDRIVE),A ;and save. - RET -; -; Move currently active drive down to (TDRIVE). -; -MOVECD: LD A,(CDRIVE) - LD (TDRIVE),A - RET -; -; Routine to convert (A) into upper case ascii. Only letters -; are affected. -; -UPPER: CP 'a' ;check for letters in the range of 'a' to 'z'. - RET C - CP '{' - RET NC - AND 5FH ;convert it if found. - RET -; -; Routine to get a line of input. We must check to see if the -; user is in (BATCH) mode. If so, then read the input from file -; ($$$.SUB). At the end, reset to console input. -; -GETINP: LD A,(BATCH) ;if =0, then use console input. - OR A - JP Z,GETINP1 -; -; Use the submit file ($$$.sub) which is prepared by a -; SUBMIT run. It must be on drive (A) and it will be deleted -; if and error occures (like eof). -; - LD A,(CDRIVE) ;select drive 0 if need be. - OR A - LD A,0 ;always use drive A for submit. - CALL NZ,DSKSEL ;select it if required. - LD DE,BATCHFCB - CALL OPEN ;look for it. - JP Z,GETINP1 ;if not there, use normal input. - LD A,(BATCHFCB+15) ;get last record number+1. - DEC A - LD (BATCHFCB+32),A - LD DE,BATCHFCB - CALL RDREC ;read last record. - JP NZ,GETINP1 ;quit on end of file. -; -; Move this record into input buffer. -; - LD DE,INBUFF+1 - LD HL,TBUFF ;data was read into buffer here. - LD B,128 ;all 128 characters may be used. - CALL HL2DE ;(HL) to (DE), (B) bytes. - LD HL,BATCHFCB+14 - LD (HL),0 ;zero out the 's2' byte. - INC HL ;and decrement the record count. - DEC (HL) - LD DE,BATCHFCB ;close the batch file now. - CALL CLOSE - JP Z,GETINP1 ;quit on an error. - LD A,(CDRIVE) ;re-select previous drive if need be. - OR A - CALL NZ,DSKSEL ;don't do needless selects. -; -; Print line just read on console. -; - LD HL,INBUFF+2 - CALL PLINE2 - CALL CHKCON ;check console, quit on a key. - JP Z,GETINP2 ;jump if no key is pressed. -; -; Terminate the submit job on any keyboard input. Delete this -; file such that it is not re-started and jump to normal keyboard -; input section. -; - CALL DELBATCH ;delete the batch file. - JP CMMND1 ;and restart command input. -; -; Get here for normal keyboard input. Delete the submit file -; incase there was one. -; -GETINP1:CALL DELBATCH ;delete file ($$$.sub). - CALL SETCDRV ;reset active disk. - LD C,10 ;get line from console device. - LD DE,INBUFF - CALL ENTRY - CALL MOVECD ;reset current drive (again). -; -; Convert input line to upper case. -; -GETINP2:LD HL,INBUFF+1 - LD B,(HL) ;(B)=character counter. -GETINP3:INC HL - LD A,B ;end of the line? - OR A - JP Z,GETINP4 - LD A,(HL) ;convert to upper case. - CALL UPPER - LD (HL),A - DEC B ;adjust character count. - JP GETINP3 -GETINP4:LD (HL),A ;add trailing null. - LD HL,INBUFF+2 - LD (INPOINT),HL ;reset input line pointer. - RET -; -; Routine to check the console for a key pressed. The zero -; flag is set is none, else the character is returned in (A). -; -CHKCON: LD C,11 ;check console. - CALL ENTRY - OR A - RET Z ;return if nothing. - LD C,1 ;else get character. - CALL ENTRY - OR A ;clear zero flag and return. - RET -; -; Routine to get the currently active drive number. -; -GETDSK: LD C,25 - JP ENTRY -; -; Set the stabdard dma address. -; -STDDMA: LD DE,TBUFF -; -; Routine to set the dma address to (DE). -; -DMASET: LD C,26 - JP ENTRY -; -; Delete the batch file created by SUBMIT. -; -DELBATCH: LD HL,BATCH ;is batch active? - LD A,(HL) - OR A - RET Z - LD (HL),0 ;yes, de-activate it. - XOR A - CALL DSKSEL ;select drive 0 for sure. - LD DE,BATCHFCB ;and delete this file. - CALL DELETE - LD A,(CDRIVE) ;reset current drive. - JP DSKSEL -; -; Check to two strings at (PATTRN1) and (PATTRN2). They must be -; the same or we halt.... -; -VERIFY: LD DE,PATTRN1 ;these are the serial number bytes. - LD HL,PATTRN2 ;ditto, but how could they be different? - LD B,6 ;6 bytes each. -VERIFY1:LD A,(DE) - CP (HL) - JP NZ,HALT ;jump to halt routine. - INC DE - INC HL - DEC B - JP NZ,VERIFY1 - RET -; -; Print back file name with a '?' to indicate a syntax error. -; -SYNERR: CALL CRLF ;end current line. - LD HL,(NAMEPNT) ;this points to name in error. -SYNERR1:LD A,(HL) ;print it until a space or null is found. - CP ' ' - JP Z,SYNERR2 - OR A - JP Z,SYNERR2 - PUSH HL - CALL PRINT - POP HL - INC HL - JP SYNERR1 -SYNERR2:LD A,'?' ;add trailing '?'. - CALL PRINT - CALL CRLF - CALL DELBATCH ;delete any batch file. - JP CMMND1 ;and restart from console input. -; -; Check character at (DE) for legal command input. Note that the -; zero flag is set if the character is a delimiter. -; -CHECK: LD A,(DE) - OR A - RET Z - CP ' ' ;control characters are not legal here. - JP C,SYNERR - RET Z ;check for valid delimiter. - CP '=' - RET Z - CP '_' - RET Z - CP '.' - RET Z - CP ':' - RET Z - CP 3bH ;semicolon; TASM can't do it in a quote - RET Z - CP '<' - RET Z - CP '>' - RET Z - RET -; -; Get the next non-blank character from (DE). -; -NONBLANK: LD A,(DE) - OR A ;string ends with a null. - RET Z - CP ' ' - RET NZ - INC DE - JP NONBLANK -; -; Add (HL)=(HL)+(A) -; -ADDHL: ADD A,L - LD L,A - RET NC ;take care of any carry. - INC H - RET -; -; Convert the first name in (FCB). -; -CONVFST:LD A,0 -; -; Format a file name (convert * to '?', etc.). On return, -; (A)=0 is an unambigeous name was specified. Enter with (A) equal to -; the position within the fcb for the name (either 0 or 16). -; -CONVERT:LD HL,FCB - CALL ADDHL - PUSH HL - PUSH HL - XOR A - LD (CHGDRV),A ;initialize drive change flag. - LD HL,(INPOINT) ;set (HL) as pointer into input line. - EX DE,HL - CALL NONBLANK ;get next non-blank character. - EX DE,HL - LD (NAMEPNT),HL ;save pointer here for any error message. - EX DE,HL - POP HL - LD A,(DE) ;get first character. - OR A - JP Z,CONVRT1 - SBC A,'A'-1 ;might be a drive name, convert to binary. - LD B,A ;and save. - INC DE ;check next character for a ':'. - LD A,(DE) - CP ':' - JP Z,CONVRT2 - DEC DE ;nope, move pointer back to the start of the line. -CONVRT1:LD A,(CDRIVE) - LD (HL),A - JP CONVRT3 -CONVRT2:LD A,B - LD (CHGDRV),A ;set change in drives flag. - LD (HL),B - INC DE -; -; Convert the basic file name. -; -CONVRT3:LD B,08H -CONVRT4:CALL CHECK - JP Z,CONVRT8 - INC HL - CP '*' ;note that an '*' will fill the remaining - JP NZ,CONVRT5 ;field with '?'. - LD (HL),'?' - JP CONVRT6 -CONVRT5:LD (HL),A - INC DE -CONVRT6:DEC B - JP NZ,CONVRT4 -CONVRT7:CALL CHECK ;get next delimiter. - JP Z,GETEXT - INC DE - JP CONVRT7 -CONVRT8:INC HL ;blank fill the file name. - LD (HL),' ' - DEC B - JP NZ,CONVRT8 -; -; Get the extension and convert it. -; -GETEXT: LD B,03H - CP '.' - JP NZ,GETEXT5 - INC DE -GETEXT1:CALL CHECK - JP Z,GETEXT5 - INC HL - CP '*' - JP NZ,GETEXT2 - LD (HL),'?' - JP GETEXT3 -GETEXT2:LD (HL),A - INC DE -GETEXT3:DEC B - JP NZ,GETEXT1 -GETEXT4:CALL CHECK - JP Z,GETEXT6 - INC DE - JP GETEXT4 -GETEXT5:INC HL - LD (HL),' ' - DEC B - JP NZ,GETEXT5 -GETEXT6:LD B,3 -GETEXT7:INC HL - LD (HL),0 - DEC B - JP NZ,GETEXT7 - EX DE,HL - LD (INPOINT),HL ;save input line pointer. - POP HL -; -; Check to see if this is an ambigeous file name specification. -; Set the (A) register to non zero if it is. -; - LD BC,11 ;set name length. -GETEXT8:INC HL - LD A,(HL) - CP '?' ;any question marks? - JP NZ,GETEXT9 - INC B ;count them. -GETEXT9:DEC C - JP NZ,GETEXT8 - LD A,B - OR A - RET -; -; CP/M command table. Note commands can be either 3 or 4 characters long. -; -NUMCMDS EQU 6 ;number of commands -CMDTBL: DEFB "DIR " - DEFB "ERA " - DEFB "TYPE" - DEFB "SAVE" - DEFB "REN " - DEFB "USER" -; -; The following six bytes must agree with those at (PATTRN2) -; or cp/m will HALT. Why? -; -PATTRN1:DEFB 0,22,0,0,0,0 ;(* serial number bytes *). -; -; Search the command table for a match with what has just -; been entered. If a match is found, then we jump to the -; proper section. Else jump to (UNKNOWN). -; On return, the (C) register is set to the command number -; that matched (or NUMCMDS+1 if no match). -; -SEARCH: LD HL,CMDTBL - LD C,0 -SEARCH1:LD A,C - CP NUMCMDS ;this commands exists. - RET NC - LD DE,FCB+1 ;check this one. - LD B,4 ;max command length. -SEARCH2:LD A,(DE) - CP (HL) - JP NZ,SEARCH3 ;not a match. - INC DE - INC HL - DEC B - JP NZ,SEARCH2 - LD A,(DE) ;allow a 3 character command to match. - CP ' ' - JP NZ,SEARCH4 - LD A,C ;set return register for this command. - RET -SEARCH3:INC HL - DEC B - JP NZ,SEARCH3 -SEARCH4:INC C - JP SEARCH1 -; -; Set the input buffer to empty and then start the command -; processor (ccp). -; -CLEARBUF: XOR A - LD (INBUFF+1),A ;second byte is actual length. -; -;************************************************************** -;* -;* -;* C C P - C o n s o l e C o m m a n d P r o c e s s o r -;* -;************************************************************** -;* -COMMAND:LD SP,CCPSTACK ;setup stack area. - PUSH BC ;note that (C) should be equal to: - LD A,C ;(uuuudddd) where 'uuuu' is the user number - RRA ;and 'dddd' is the drive number. - RRA - RRA - RRA - AND 0FH ;isolate the user number. - LD E,A - CALL GETSETUC ;and set it. - CALL RESDSK ;reset the disk system. - LD (BATCH),A ;clear batch mode flag. - POP BC - LD A,C - AND 0FH ;isolate the drive number. - LD (CDRIVE),A ;and save. - CALL DSKSEL ;...and select. - LD A,(INBUFF+1) - OR A ;anything in input buffer already? - JP NZ,CMMND2 ;yes, we just process it. -; -; Entry point to get a command line from the console. -; -CMMND1: LD SP,CCPSTACK ;set stack straight. - CALL CRLF ;start a new line on the screen. - CALL GETDSK ;get current drive. - ADD A,'A' - CALL PRINT ;print current drive. - LD A,'>' - CALL PRINT ;and add prompt. - CALL GETINP ;get line from user. -; -; Process command line here. -; -CMMND2: LD DE,TBUFF - CALL DMASET ;set standard dma address. - CALL GETDSK - LD (CDRIVE),A ;set current drive. - CALL CONVFST ;convert name typed in. - CALL NZ,SYNERR ;wild cards are not allowed. - LD A,(CHGDRV) ;if a change in drives was indicated, - OR A ;then treat this as an unknown command - JP NZ,UNKNOWN ;which gets executed. - CALL SEARCH ;else search command table for a match. -; -; Note that an unknown command returns -; with (A) pointing to the last address -; in our table which is (UNKNOWN). -; - LD HL,CMDADR ;now, look thru our address table for command (A). - LD E,A ;set (DE) to command number. - LD D,0 - ADD HL,DE - ADD HL,DE ;(HL)=(CMDADR)+2*(command number). - LD A,(HL) ;now pick out this address. - INC HL - LD H,(HL) - LD L,A - JP (HL) ;now execute it. -; -; CP/M command address table. -; -CMDADR: DEFW DIRECT,ERASE,TYPE,SAVE - DEFW RENAME,USER,UNKNOWN -; -; Halt the system. Reason for this is unknown at present. -; -HALT: LD HL,76F3H ;'DI HLT' instructions. - LD (CBASE),HL - LD HL,CBASE - JP (HL) -; -; Read error while TYPEing a file. -; -RDERROR:LD BC,RDERR - JP PLINE -RDERR: DEFB "Read error",0 -; -; Required file was not located. -; -NONE: LD BC,NOFILE - JP PLINE -NOFILE: DEFB "No file",0 -; -; Decode a command of the form 'A>filename number{ filename}. -; Note that a drive specifier is not allowed on the first file -; name. On return, the number is in register (A). Any error -; causes 'filename?' to be printed and the command is aborted. -; -DECODE: CALL CONVFST ;convert filename. - LD A,(CHGDRV) ;do not allow a drive to be specified. - OR A - JP NZ,SYNERR - LD HL,FCB+1 ;convert number now. - LD BC,11 ;(B)=sum register, (C)=max digit count. -DECODE1:LD A,(HL) - CP ' ' ;a space terminates the numeral. - JP Z,DECODE3 - INC HL - SUB '0' ;make binary from ascii. - CP 10 ;legal digit? - JP NC,SYNERR - LD D,A ;yes, save it in (D). - LD A,B ;compute (B)=(B)*10 and check for overflow. - AND 0E0H - JP NZ,SYNERR - LD A,B - RLCA - RLCA - RLCA ;(A)=(B)*8 - ADD A,B ;.......*9 - JP C,SYNERR - ADD A,B ;.......*10 - JP C,SYNERR - ADD A,D ;add in new digit now. -DECODE2:JP C,SYNERR - LD B,A ;and save result. - DEC C ;only look at 11 digits. - JP NZ,DECODE1 - RET -DECODE3:LD A,(HL) ;spaces must follow (why?). - CP ' ' - JP NZ,SYNERR - INC HL -DECODE4:DEC C - JP NZ,DECODE3 - LD A,B ;set (A)=the numeric value entered. - RET -; -; Move 3 bytes from (HL) to (DE). Note that there is only -; one reference to this at (A2D5h). -; -MOVE3: LD B,3 -; -; Move (B) bytes from (HL) to (DE). -; -HL2DE: LD A,(HL) - LD (DE),A - INC HL - INC DE - DEC B - JP NZ,HL2DE - RET -; -; Compute (HL)=(TBUFF)+(A)+(C) and get the byte that's here. -; -EXTRACT:LD HL,TBUFF - ADD A,C - CALL ADDHL - LD A,(HL) - RET -; -; Check drive specified. If it means a change, then the new -; drive will be selected. In any case, the drive byte of the -; fcb will be set to null (means use current drive). -; -DSELECT:XOR A ;null out first byte of fcb. - LD (FCB),A - LD A,(CHGDRV) ;a drive change indicated? - OR A - RET Z - DEC A ;yes, is it the same as the current drive? - LD HL,CDRIVE - CP (HL) - RET Z - JP DSKSEL ;no. Select it then. -; -; Check the drive selection and reset it to the previous -; drive if it was changed for the preceeding command. -; -RESETDR:LD A,(CHGDRV) ;drive change indicated? - OR A - RET Z - DEC A ;yes, was it a different drive? - LD HL,CDRIVE - CP (HL) - RET Z - LD A,(CDRIVE) ;yes, re-select our old drive. - JP DSKSEL -; -;************************************************************** -;* -;* D I R E C T O R Y C O M M A N D -;* -;************************************************************** -; -DIRECT: CALL CONVFST ;convert file name. - CALL DSELECT ;select indicated drive. - LD HL,FCB+1 ;was any file indicated? - LD A,(HL) - CP ' ' - JP NZ,DIRECT2 - LD B,11 ;no. Fill field with '?' - same as *.*. -DIRECT1:LD (HL),'?' - INC HL - DEC B - JP NZ,DIRECT1 -DIRECT2:LD E,0 ;set initial cursor position. - PUSH DE - CALL SRCHFCB ;get first file name. - CALL Z,NONE ;none found at all? -DIRECT3:JP Z,DIRECT9 ;terminate if no more names. - LD A,(RTNCODE) ;get file's position in segment (0-3). - RRCA - RRCA - RRCA - AND 60H ;(A)=position*32 - LD C,A - LD A,10 - CALL EXTRACT ;extract the tenth entry in fcb. - RLA ;check system file status bit. - JP C,DIRECT8 ;we don't list them. - POP DE - LD A,E ;bump name count. - INC E - PUSH DE - AND 03H ;at end of line? - PUSH AF - JP NZ,DIRECT4 - CALL CRLF ;yes, end this line and start another. - PUSH BC - CALL GETDSK ;start line with ('A:'). - POP BC - ADD A,'A' - CALL PRINTB - LD A,':' - CALL PRINTB - JP DIRECT5 -DIRECT4:CALL SPACE ;add seperator between file names. - LD A,':' - CALL PRINTB -DIRECT5:CALL SPACE - LD B,1 ;'extract' each file name character at a time. -DIRECT6:LD A,B - CALL EXTRACT - AND 7FH ;strip bit 7 (status bit). - CP ' ' ;are we at the end of the name? - JP NZ,DRECT65 - POP AF ;yes, don't print spaces at the end of a line. - PUSH AF - CP 3 - JP NZ,DRECT63 - LD A,9 ;first check for no extension. - CALL EXTRACT - AND 7FH - CP ' ' - JP Z,DIRECT7 ;don't print spaces. -DRECT63:LD A,' ' ;else print them. -DRECT65:CALL PRINTB - INC B ;bump to next character psoition. - LD A,B - CP 12 ;end of the name? - JP NC,DIRECT7 - CP 9 ;nope, starting extension? - JP NZ,DIRECT6 - CALL SPACE ;yes, add seperating space. - JP DIRECT6 -DIRECT7:POP AF ;get the next file name. -DIRECT8:CALL CHKCON ;first check console, quit on anything. - JP NZ,DIRECT9 - CALL SRCHNXT ;get next name. - JP DIRECT3 ;and continue with our list. -DIRECT9:POP DE ;restore the stack and return to command level. - JP GETBACK -; -;************************************************************** -;* -;* E R A S E C O M M A N D -;* -;************************************************************** -; -ERASE: CALL CONVFST ;convert file name. - CP 11 ;was '*.*' entered? - JP NZ,ERASE1 - LD BC,YESNO ;yes, ask for confirmation. - CALL PLINE - CALL GETINP - LD HL,INBUFF+1 - DEC (HL) ;must be exactly 'y'. - JP NZ,CMMND1 - INC HL - LD A,(HL) - CP 'Y' - JP NZ,CMMND1 - INC HL - LD (INPOINT),HL ;save input line pointer. -ERASE1: CALL DSELECT ;select desired disk. - LD DE,FCB - CALL DELETE ;delete the file. - INC A - CALL Z,NONE ;not there? - JP GETBACK ;return to command level now. -YESNO: DEFB "All (y/n)?",0 -; -;************************************************************** -;* -;* T Y P E C O M M A N D -;* -;************************************************************** -; -TYPE: CALL CONVFST ;convert file name. - JP NZ,SYNERR ;wild cards not allowed. - CALL DSELECT ;select indicated drive. - CALL OPENFCB ;open the file. - JP Z,TYPE5 ;not there? - CALL CRLF ;ok, start a new line on the screen. - LD HL,NBYTES ;initialize byte counter. - LD (HL),0FFH ;set to read first sector. -TYPE1: LD HL,NBYTES -TYPE2: LD A,(HL) ;have we written the entire sector? - CP 128 - JP C,TYPE3 - PUSH HL ;yes, read in the next one. - CALL READFCB - POP HL - JP NZ,TYPE4 ;end or error? - XOR A ;ok, clear byte counter. - LD (HL),A -TYPE3: INC (HL) ;count this byte. - LD HL,TBUFF ;and get the (A)th one from the buffer (TBUFF). - CALL ADDHL - LD A,(HL) - CP CNTRLZ ;end of file mark? - JP Z,GETBACK - CALL PRINT ;no, print it. - CALL CHKCON ;check console, quit if anything ready. - JP NZ,GETBACK - JP TYPE1 -; -; Get here on an end of file or read error. -; -TYPE4: DEC A ;read error? - JP Z,GETBACK - CALL RDERROR ;yes, print message. -TYPE5: CALL RESETDR ;and reset proper drive - JP SYNERR ;now print file name with problem. -; -;************************************************************** -;* -;* S A V E C O M M A N D -;* -;************************************************************** -; -SAVE: CALL DECODE ;get numeric number that follows SAVE. - PUSH AF ;save number of pages to write. - CALL CONVFST ;convert file name. - JP NZ,SYNERR ;wild cards not allowed. - CALL DSELECT ;select specified drive. - LD DE,FCB ;now delete this file. - PUSH DE - CALL DELETE - POP DE - CALL CREATE ;and create it again. - JP Z,SAVE3 ;can't create? - XOR A ;clear record number byte. - LD (FCB+32),A - POP AF ;convert pages to sectors. - LD L,A - LD H,0 - ADD HL,HL ;(HL)=number of sectors to write. - LD DE,TBASE ;and we start from here. -SAVE1: LD A,H ;done yet? - OR L - JP Z,SAVE2 - DEC HL ;nope, count this and compute the start - PUSH HL ;of the next 128 byte sector. - LD HL,128 - ADD HL,DE - PUSH HL ;save it and set the transfer address. - CALL DMASET - LD DE,FCB ;write out this sector now. - CALL WRTREC - POP DE ;reset (DE) to the start of the last sector. - POP HL ;restore sector count. - JP NZ,SAVE3 ;write error? - JP SAVE1 -; -; Get here after writing all of the file. -; -SAVE2: LD DE,FCB ;now close the file. - CALL CLOSE - INC A ;did it close ok? - JP NZ,SAVE4 -; -; Print out error message (no space). -; -SAVE3: LD BC,NOSPACE - CALL PLINE -SAVE4: CALL STDDMA ;reset the standard dma address. - JP GETBACK -NOSPACE:DEFB "No space",0 -; -;************************************************************** -;* -;* R E N A M E C O M M A N D -;* -;************************************************************** -; -RENAME: CALL CONVFST ;convert first file name. - JP NZ,SYNERR ;wild cards not allowed. - LD A,(CHGDRV) ;remember any change in drives specified. - PUSH AF - CALL DSELECT ;and select this drive. - CALL SRCHFCB ;is this file present? - JP NZ,RENAME6 ;yes, print error message. - LD HL,FCB ;yes, move this name into second slot. - LD DE,FCB+16 - LD B,16 - CALL HL2DE - LD HL,(INPOINT) ;get input pointer. - EX DE,HL - CALL NONBLANK ;get next non blank character. - CP '=' ;only allow an '=' or '_' seperator. - JP Z,RENAME1 - CP '_' - JP NZ,RENAME5 -RENAME1:EX DE,HL - INC HL ;ok, skip seperator. - LD (INPOINT),HL ;save input line pointer. - CALL CONVFST ;convert this second file name now. - JP NZ,RENAME5 ;again, no wild cards. - POP AF ;if a drive was specified, then it - LD B,A ;must be the same as before. - LD HL,CHGDRV - LD A,(HL) - OR A - JP Z,RENAME2 - CP B - LD (HL),B - JP NZ,RENAME5 ;they were different, error. -RENAME2:LD (HL),B ; reset as per the first file specification. - XOR A - LD (FCB),A ;clear the drive byte of the fcb. -RENAME3:CALL SRCHFCB ;and go look for second file. - JP Z,RENAME4 ;doesn't exist? - LD DE,FCB - CALL RENAM ;ok, rename the file. - JP GETBACK -; -; Process rename errors here. -; -RENAME4:CALL NONE ;file not there. - JP GETBACK -RENAME5:CALL RESETDR ;bad command format. - JP SYNERR -RENAME6:LD BC,EXISTS ;destination file already exists. - CALL PLINE - JP GETBACK -EXISTS: DEFB "File exists",0 -; -;************************************************************** -;* -;* U S E R C O M M A N D -;* -;************************************************************** -; -USER: CALL DECODE ;get numeric value following command. - CP 16 ;legal user number? - JP NC,SYNERR - LD E,A ;yes but is there anything else? - LD A,(FCB+1) - CP ' ' - JP Z,SYNERR ;yes, that is not allowed. - CALL GETSETUC ;ok, set user code. - JP GETBACK1 -; -;************************************************************** -;* -;* T R A N S I A N T P R O G R A M C O M M A N D -;* -;************************************************************** -; -UNKNOWN:CALL VERIFY ;check for valid system (why?). - LD A,(FCB+1) ;anything to execute? - CP ' ' - JP NZ,UNKWN1 - LD A,(CHGDRV) ;nope, only a drive change? - OR A - JP Z,GETBACK1 ;neither??? - DEC A - LD (CDRIVE),A ;ok, store new drive. - CALL MOVECD ;set (TDRIVE) also. - CALL DSKSEL ;and select this drive. - JP GETBACK1 ;then return. -; -; Here a file name was typed. Prepare to execute it. -; -UNKWN1: LD DE,FCB+9 ;an extension specified? - LD A,(DE) - CP ' ' - JP NZ,SYNERR ;yes, not allowed. -UNKWN2: PUSH DE - CALL DSELECT ;select specified drive. - POP DE - LD HL,COMFILE ;set the extension to 'COM'. - CALL MOVE3 - CALL OPENFCB ;and open this file. - JP Z,UNKWN9 ;not present? -; -; Load in the program. -; - LD HL,TBASE ;store the program starting here. -UNKWN3: PUSH HL - EX DE,HL - CALL DMASET ;set transfer address. - LD DE,FCB ;and read the next record. - CALL RDREC - JP NZ,UNKWN4 ;end of file or read error? - POP HL ;nope, bump pointer for next sector. - LD DE,128 - ADD HL,DE - LD DE,CBASE ;enough room for the whole file? - LD A,L - SUB E - LD A,H - SBC A,D - JP NC,UNKWN0 ;no, it can't fit. - JP UNKWN3 -; -; Get here after finished reading. -; -UNKWN4: POP HL - DEC A ;normal end of file? - JP NZ,UNKWN0 - CALL RESETDR ;yes, reset previous drive. - CALL CONVFST ;convert the first file name that follows - LD HL,CHGDRV ;command name. - PUSH HL - LD A,(HL) ;set drive code in default fcb. - LD (FCB),A - LD A,16 ;put second name 16 bytes later. - CALL CONVERT ;convert second file name. - POP HL - LD A,(HL) ;and set the drive for this second file. - LD (FCB+16),A - XOR A ;clear record byte in fcb. - LD (FCB+32),A - LD DE,TFCB ;move it into place at(005Ch). - LD HL,FCB - LD B,33 - CALL HL2DE - LD HL,INBUFF+2 ;now move the remainder of the input -UNKWN5: LD A,(HL) ;line down to (0080h). Look for a non blank. - OR A ;or a null. - JP Z,UNKWN6 - CP ' ' - JP Z,UNKWN6 - INC HL - JP UNKWN5 -; -; Do the line move now. It ends in a null byte. -; -UNKWN6: LD B,0 ;keep a character count. - LD DE,TBUFF+1 ;data gets put here. -UNKWN7: LD A,(HL) ;move it now. - LD (DE),A - OR A - JP Z,UNKWN8 - INC B - INC HL - INC DE - JP UNKWN7 -UNKWN8: LD A,B ;now store the character count. - LD (TBUFF),A - CALL CRLF ;clean up the screen. - CALL STDDMA ;set standard transfer address. - CALL SETCDRV ;reset current drive. - CALL TBASE ;and execute the program. -; -; Transiant programs return here (or reboot). -; - LD SP,BATCH ;set stack first off. - CALL MOVECD ;move current drive into place (TDRIVE). - CALL DSKSEL ;and reselect it. - JP CMMND1 ;back to comand mode. -; -; Get here if some error occured. -; -UNKWN9: CALL RESETDR ;inproper format. - JP SYNERR -UNKWN0: LD BC,BADLOAD ;read error or won't fit. - CALL PLINE - JP GETBACK -BADLOAD:DEFB "Bad load",0 -COMFILE:DEFB "COM" ;command file extension. -; -; Get here to return to command level. We will reset the -; previous active drive and then either return to command -; level directly or print error message and then return. -; -GETBACK:CALL RESETDR ;reset previous drive. -GETBACK1: CALL CONVFST ;convert first name in (FCB). - LD A,(FCB+1) ;if this was just a drive change request, - SUB ' ' ;make sure it was valid. - LD HL,CHGDRV - OR (HL) - JP NZ,SYNERR - JP CMMND1 ;ok, return to command level. -; -; ccp stack area. -; - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -CCPSTACK EQU $ ;end of ccp stack area. -; -; Batch (or SUBMIT) processing information storage. -; -BATCH: DEFB 0 ;batch mode flag (0=not active). -BATCHFCB: DEFB 0 - TEXT "$$$ SUB" - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -; -; File control block setup by the CCP. -; -FCB: DEFB 0 - TEXT " " - DEFB 0,0,0,0,0, - TEXT " " - DEFB 0,0,0,0,0 -RTNCODE:DEFB 0 ;status returned from bdos call. -CDRIVE: DEFB 0 ;currently active drive. -CHGDRV: DEFB 0 ;change in drives flag (0=no change). -NBYTES: DEFW 0 ;byte counter used by TYPE. -; -; Room for expansion? -; - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0 -; -; Note that the following six bytes must match those at -; (PATTRN1) or cp/m will HALT. Why? -; -PATTRN2:DEFB 0,22,0,0,0,0 ;(* serial number bytes *). -; -;************************************************************** -;* -;* B D O S E N T R Y -;* -;************************************************************** -; -FBASE: JP FBASE1 -; -; Bdos error table. -; -BADSCTR:DEFW ERROR1 ;bad sector on read or write. -BADSLCT:DEFW ERROR2 ;bad disk select. -RODISK: DEFW ERROR3 ;disk is read only. -ROFILE: DEFW ERROR4 ;file is read only. -; -; Entry into bdos. (DE) or (E) are the parameters passed. The -; function number desired is in register (C). -; -FBASE1: EX DE,HL ;save the (DE) parameters. - LD (PARAMS),HL - EX DE,HL - LD A,E ;and save register (E) in particular. - LD (EPARAM),A - LD HL,0 - LD (STATUS),HL ;clear return status. - ADD HL,SP - LD (USRSTACK),HL ;save users stack pointer. - LD SP,STKAREA ;and set our own. - XOR A ;clear auto select storage space. - LD (AUTOFLAG),A - LD (AUTO),A - LD HL,GOBACK ;set return address. - PUSH HL - LD A,C ;get function number. - CP NFUNCTS ;valid function number? - RET NC - LD C,E ;keep single register function here. - LD HL,FUNCTNS ;now look thru the function table. - LD E,A - LD D,0 ;(DE)=function number. - ADD HL,DE - ADD HL,DE ;(HL)=(start of table)+2*(function number). - LD E,(HL) - INC HL - LD D,(HL) ;now (DE)=address for this function. - LD HL,(PARAMS) ;retrieve parameters. - EX DE,HL ;now (DE) has the original parameters. - JP (HL) ;execute desired function. -; -; BDOS function jump table. -; -NFUNCTS EQU 41 ;number of functions in followin table. -; -FUNCTNS:DEFW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB - DEFW SETIOB,PRTSTR,RDBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL - DEFW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE - DEFW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR - DEFW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN - DEFW RTN,WTSPECL -; -; Bdos error message section. -; -ERROR1: LD HL,BADSEC ;bad sector message. - CALL PRTERR ;print it and get a 1 char responce. - CP CNTRLC ;re-boot request (control-c)? - JP Z,0 ;yes. - RET ;no, return to retry i/o function. -; -ERROR2: LD HL,BADSEL ;bad drive selected. - JP ERROR5 -; -ERROR3: LD HL,DISKRO ;disk is read only. - JP ERROR5 -; -ERROR4: LD HL,FILERO ;file is read only. -; -ERROR5: CALL PRTERR - JP 0 ;always reboot on these errors. -; -BDOSERR:DEFB "Bdos Err On " -BDOSDRV:DEFB " : $" -BADSEC: DEFB "Bad Sector$" -BADSEL: DEFB "Select$" -FILERO: DEFB "File " -DISKRO: DEFB "R/O$" -; -; Print bdos error message. -; -PRTERR: PUSH HL ;save second message pointer. - CALL OUTCRLF ;send (cr)(lf). - LD A,(ACTIVE) ;get active drive. - ADD A,'A' ;make ascii. - LD (BDOSDRV),A ;and put in message. - LD BC,BDOSERR ;and print it. - CALL PRTMESG - POP BC ;print second message line now. - CALL PRTMESG -; -; Get an input character. We will check our 1 character -; buffer first. This may be set by the console status routine. -; -GETCHAR:LD HL,CHARBUF ;check character buffer. - LD A,(HL) ;anything present already? - LD (HL),0 ;...either case clear it. - OR A - RET NZ ;yes, use it. - JP CONIN ;nope, go get a character responce. -; -; Input and echo a character. -; -GETECHO:CALL GETCHAR ;input a character. - CALL CHKCHAR ;carriage control? - RET C ;no, a regular control char so don't echo. - PUSH AF ;ok, save character now. - LD C,A - CALL OUTCON ;and echo it. - POP AF ;get character and return. - RET -; -; Check character in (A). Set the zero flag on a carriage -; control character and the carry flag on any other control -; character. -; -CHKCHAR:CP CR ;check for carriage return, line feed, backspace, - RET Z ;or a tab. - CP LF - RET Z - CP TAB - RET Z - CP BS - RET Z - CP ' ' ;other control char? Set carry flag. - RET -; -; Check the console during output. Halt on a control-s, then -; reboot on a control-c. If anything else is ready, clear the -; zero flag and return (the calling routine may want to do -; something). -; -CKCONSOL: LD A,(CHARBUF) ;check buffer. - OR A ;if anything, just return without checking. - JP NZ,CKCON2 - CALL CONST ;nothing in buffer. Check console. - AND 01H ;look at bit 0. - RET Z ;return if nothing. - CALL CONIN ;ok, get it. - CP CNTRLS ;if not control-s, return with zero cleared. - JP NZ,CKCON1 - CALL CONIN ;halt processing until another char - CP CNTRLC ;is typed. Control-c? - JP Z,0 ;yes, reboot now. - XOR A ;no, just pretend nothing was ever ready. - RET -CKCON1: LD (CHARBUF),A ;save character in buffer for later processing. -CKCON2: LD A,1 ;set (A) to non zero to mean something is ready. - RET -; -; Output (C) to the screen. If the printer flip-flop flag -; is set, we will send character to printer also. The console -; will be checked in the process. -; -OUTCHAR:LD A,(OUTFLAG) ;check output flag. - OR A ;anything and we won't generate output. - JP NZ,OUTCHR1 - PUSH BC - CALL CKCONSOL ;check console (we don't care whats there). - POP BC - PUSH BC - CALL CONOUT ;output (C) to the screen. - POP BC - PUSH BC - LD A,(PRTFLAG) ;check printer flip-flop flag. - OR A - CALL NZ,LIST ;print it also if non-zero. - POP BC -OUTCHR1:LD A,C ;update cursors position. - LD HL,CURPOS - CP DEL ;rubouts don't do anything here. - RET Z - INC (HL) ;bump line pointer. - CP ' ' ;and return if a normal character. - RET NC - DEC (HL) ;restore and check for the start of the line. - LD A,(HL) - OR A - RET Z ;ingnore control characters at the start of the line. - LD A,C - CP BS ;is it a backspace? - JP NZ,OUTCHR2 - DEC (HL) ;yes, backup pointer. - RET -OUTCHR2:CP LF ;is it a line feed? - RET NZ ;ignore anything else. - LD (HL),0 ;reset pointer to start of line. - RET -; -; Output (A) to the screen. If it is a control character -; (other than carriage control), use ^x format. -; -SHOWIT: LD A,C - CALL CHKCHAR ;check character. - JP NC,OUTCON ;not a control, use normal output. - PUSH AF - LD C,'^' ;for a control character, preceed it with '^'. - CALL OUTCHAR - POP AF - OR '@' ;and then use the letter equivelant. - LD C,A -; -; Function to output (C) to the console device and expand tabs -; if necessary. -; -OUTCON: LD A,C - CP TAB ;is it a tab? - JP NZ,OUTCHAR ;use regular output. -OUTCON1:LD C,' ' ;yes it is, use spaces instead. - CALL OUTCHAR - LD A,(CURPOS) ;go until the cursor is at a multiple of 8 - - AND 07H ;position. - JP NZ,OUTCON1 - RET -; -; Echo a backspace character. Erase the prevoius character -; on the screen. -; -BACKUP: CALL BACKUP1 ;backup the screen 1 place. - LD C,' ' ;then blank that character. - CALL CONOUT -BACKUP1:LD C,BS ;then back space once more. - JP CONOUT -; -; Signal a deleted line. Print a '#' at the end and start -; over. -; -NEWLINE:LD C,'#' - CALL OUTCHAR ;print this. - CALL OUTCRLF ;start new line. -NEWLN1: LD A,(CURPOS) ;move the cursor to the starting position. - LD HL,STARTING - CP (HL) - RET NC ;there yet? - LD C,' ' - CALL OUTCHAR ;nope, keep going. - JP NEWLN1 -; -; Output a (cr) (lf) to the console device (screen). -; -OUTCRLF:LD C,CR - CALL OUTCHAR - LD C,LF - JP OUTCHAR -; -; Print message pointed to by (BC). It will end with a '$'. -; -PRTMESG:LD A,(BC) ;check for terminating character. - CP '$' - RET Z - INC BC - PUSH BC ;otherwise, bump pointer and print it. - LD C,A - CALL OUTCON - POP BC - JP PRTMESG -; -; Function to execute a buffered read. -; -RDBUFF: LD A,(CURPOS) ;use present location as starting one. - LD (STARTING),A - LD HL,(PARAMS) ;get the maximum buffer space. - LD C,(HL) - INC HL ;point to first available space. - PUSH HL ;and save. - LD B,0 ;keep a character count. -RDBUF1: PUSH BC - PUSH HL -RDBUF2: CALL GETCHAR ;get the next input character. - AND 7FH ;strip bit 7. - POP HL ;reset registers. - POP BC - CP CR ;en of the line? - JP Z,RDBUF17 - CP LF - JP Z,RDBUF17 - CP BS ;how about a backspace? - JP NZ,RDBUF3 - LD A,B ;yes, but ignore at the beginning of the line. - OR A - JP Z,RDBUF1 - DEC B ;ok, update counter. - LD A,(CURPOS) ;if we backspace to the start of the line, - LD (OUTFLAG),A ;treat as a cancel (control-x). - JP RDBUF10 -RDBUF3: CP DEL ;user typed a rubout? - JP NZ,RDBUF4 - LD A,B ;ignore at the start of the line. - OR A - JP Z,RDBUF1 - LD A,(HL) ;ok, echo the prevoius character. - DEC B ;and reset pointers (counters). - DEC HL - JP RDBUF15 -RDBUF4: CP CNTRLE ;physical end of line? - JP NZ,RDBUF5 - PUSH BC ;yes, do it. - PUSH HL - CALL OUTCRLF - XOR A ;and update starting position. - LD (STARTING),A - JP RDBUF2 -RDBUF5: CP CNTRLP ;control-p? - JP NZ,RDBUF6 - PUSH HL ;yes, flip the print flag filp-flop byte. - LD HL,PRTFLAG - LD A,1 ;PRTFLAG=1-PRTFLAG - SUB (HL) - LD (HL),A - POP HL - JP RDBUF1 -RDBUF6: CP CNTRLX ;control-x (cancel)? - JP NZ,RDBUF8 - POP HL -RDBUF7: LD A,(STARTING) ;yes, backup the cursor to here. - LD HL,CURPOS - CP (HL) - JP NC,RDBUFF ;done yet? - DEC (HL) ;no, decrement pointer and output back up one space. - CALL BACKUP - JP RDBUF7 -RDBUF8: CP CNTRLU ;cntrol-u (cancel line)? - JP NZ,RDBUF9 - CALL NEWLINE ;start a new line. - POP HL - JP RDBUFF -RDBUF9: CP CNTRLR ;control-r? - JP NZ,RDBUF14 -RDBUF10:PUSH BC ;yes, start a new line and retype the old one. - CALL NEWLINE - POP BC - POP HL - PUSH HL - PUSH BC -RDBUF11:LD A,B ;done whole line yet? - OR A - JP Z,RDBUF12 - INC HL ;nope, get next character. - LD C,(HL) - DEC B ;count it. - PUSH BC - PUSH HL - CALL SHOWIT ;and display it. - POP HL - POP BC - JP RDBUF11 -RDBUF12:PUSH HL ;done with line. If we were displaying - LD A,(OUTFLAG) ;then update cursor position. - OR A - JP Z,RDBUF2 - LD HL,CURPOS ;because this line is shorter, we must - SUB (HL) ;back up the cursor (not the screen however) - LD (OUTFLAG),A ;some number of positions. -RDBUF13:CALL BACKUP ;note that as long as (OUTFLAG) is non - LD HL,OUTFLAG ;zero, the screen will not be changed. - DEC (HL) - JP NZ,RDBUF13 - JP RDBUF2 ;now just get the next character. -; -; Just a normal character, put this in our buffer and echo. -; -RDBUF14:INC HL - LD (HL),A ;store character. - INC B ;and count it. -RDBUF15:PUSH BC - PUSH HL - LD C,A ;echo it now. - CALL SHOWIT - POP HL - POP BC - LD A,(HL) ;was it an abort request? - CP CNTRLC ;control-c abort? - LD A,B - JP NZ,RDBUF16 - CP 1 ;only if at start of line. - JP Z,0 -RDBUF16:CP C ;nope, have we filled the buffer? - JP C,RDBUF1 -RDBUF17:POP HL ;yes end the line and return. - LD (HL),B - LD C,CR - JP OUTCHAR ;output (cr) and return. -; -; Function to get a character from the console device. -; -GETCON: CALL GETECHO ;get and echo. - JP SETSTAT ;save status and return. -; -; Function to get a character from the tape reader device. -; -GETRDR: CALL READER ;get a character from reader, set status and return. - JP SETSTAT -; -; Function to perform direct console i/o. If (C) contains (FF) -; then this is an input request. If (C) contains (FE) then -; this is a status request. Otherwise we are to output (C). -; -DIRCIO: LD A,C ;test for (FF). - INC A - JP Z,DIRC1 - INC A ;test for (FE). - JP Z,CONST - JP CONOUT ;just output (C). -DIRC1: CALL CONST ;this is an input request. - OR A - JP Z,GOBACK1 ;not ready? Just return (directly). - CALL CONIN ;yes, get character. - JP SETSTAT ;set status and return. -; -; Function to return the i/o byte. -; -GETIOB: LD A,(IOBYTE) - JP SETSTAT -; -; Function to set the i/o byte. -; -SETIOB: LD HL,IOBYTE - LD (HL),C - RET -; -; Function to print the character string pointed to by (DE) -; on the console device. The string ends with a '$'. -; -PRTSTR: EX DE,HL - LD C,L - LD B,H ;now (BC) points to it. - JP PRTMESG -; -; Function to interigate the console device. -; -GETCSTS:CALL CKCONSOL -; -; Get here to set the status and return to the cleanup -; section. Then back to the user. -; -SETSTAT:LD (STATUS),A -RTN: RET -; -; Set the status to 1 (read or write error code). -; -IOERR1: LD A,1 - JP SETSTAT -; -OUTFLAG:DEFB 0 ;output flag (non zero means no output). -STARTING: DEFB 2 ;starting position for cursor. -CURPOS: DEFB 0 ;cursor position (0=start of line). -PRTFLAG:DEFB 0 ;printer flag (control-p toggle). List if non zero. -CHARBUF:DEFB 0 ;single input character buffer. -; -; Stack area for BDOS calls. -; -USRSTACK: DEFW 0 ;save users stack pointer here. -; - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -STKAREA EQU $ ;end of stack area. -; -USERNO: DEFB 0 ;current user number. -ACTIVE: DEFB 0 ;currently active drive. -PARAMS: DEFW 0 ;save (DE) parameters here on entry. -STATUS: DEFW 0 ;status returned from bdos function. -; -; Select error occured, jump to error routine. -; -SLCTERR:LD HL,BADSLCT -; -; Jump to (HL) indirectly. -; -JUMPHL: LD E,(HL) - INC HL - LD D,(HL) ;now (DE) contain the desired address. - EX DE,HL - JP (HL) -; -; Block move. (DE) to (HL), (C) bytes total. -; -DE2HL: INC C ;is count down to zero? -DE2HL1: DEC C - RET Z ;yes, we are done. - LD A,(DE) ;no, move one more byte. - LD (HL),A - INC DE - INC HL - JP DE2HL1 ;and repeat. -; -; Select the desired drive. -; -SELECT: LD A,(ACTIVE) ;get active disk. - LD C,A - CALL SELDSK ;select it. - LD A,H ;valid drive? - OR L ;valid drive? - RET Z ;return if not. -; -; Here, the BIOS returned the address of the parameter block -; in (HL). We will extract the necessary pointers and save them. -; - LD E,(HL) ;yes, get address of translation table into (DE). - INC HL - LD D,(HL) - INC HL - LD (SCRATCH1),HL ;save pointers to scratch areas. - INC HL - INC HL - LD (SCRATCH2),HL ;ditto. - INC HL - INC HL - LD (SCRATCH3),HL ;ditto. - INC HL - INC HL - EX DE,HL ;now save the translation table address. - LD (XLATE),HL - LD HL,DIRBUF ;put the next 8 bytes here. - LD C,8 ;they consist of the directory buffer - CALL DE2HL ;pointer, parameter block pointer, - LD HL,(DISKPB) ;check and allocation vectors. - EX DE,HL - LD HL,SECTORS ;move parameter block into our ram. - LD C,15 ;it is 15 bytes long. - CALL DE2HL - LD HL,(DSKSIZE) ;check disk size. - LD A,H ;more than 256 blocks on this? - LD HL,BIGDISK - LD (HL),0FFH ;set to samll. - OR A - JP Z,SELECT1 - LD (HL),0 ;wrong, set to large. -SELECT1:LD A,0FFH ;clear the zero flag. - OR A - RET -; -; Routine to home the disk track head and clear pointers. -; -HOMEDRV:CALL HOME ;home the head. - XOR A - LD HL,(SCRATCH2) ;set our track pointer also. - LD (HL),A - INC HL - LD (HL),A - LD HL,(SCRATCH3) ;and our sector pointer. - LD (HL),A - INC HL - LD (HL),A - RET -; -; Do the actual disk read and check the error return status. -; -DOREAD: CALL READ - JP IORET -; -; Do the actual disk write and handle any bios error. -; -DOWRITE:CALL WRITE -IORET: OR A - RET Z ;return unless an error occured. - LD HL,BADSCTR ;bad read/write on this sector. - JP JUMPHL -; -; Routine to select the track and sector that the desired -; block number falls in. -; -TRKSEC: LD HL,(FILEPOS) ;get position of last accessed file - LD C,2 ;in directory and compute sector #. - CALL SHIFTR ;sector #=file-position/4. - LD (BLKNMBR),HL ;save this as the block number of interest. - LD (CKSUMTBL),HL ;what's it doing here too? -; -; if the sector number has already been set (BLKNMBR), enter -; at this point. -; -TRKSEC1:LD HL,BLKNMBR - LD C,(HL) ;move sector number into (BC). - INC HL - LD B,(HL) - LD HL,(SCRATCH3) ;get current sector number and - LD E,(HL) ;move this into (DE). - INC HL - LD D,(HL) - LD HL,(SCRATCH2) ;get current track number. - LD A,(HL) ;and this into (HL). - INC HL - LD H,(HL) - LD L,A -TRKSEC2:LD A,C ;is desired sector before current one? - SUB E - LD A,B - SBC A,D - JP NC,TRKSEC3 - PUSH HL ;yes, decrement sectors by one track. - LD HL,(SECTORS) ;get sectors per track. - LD A,E - SUB L - LD E,A - LD A,D - SBC A,H - LD D,A ;now we have backed up one full track. - POP HL - DEC HL ;adjust track counter. - JP TRKSEC2 -TRKSEC3:PUSH HL ;desired sector is after current one. - LD HL,(SECTORS) ;get sectors per track. - ADD HL,DE ;bump sector pointer to next track. - JP C,TRKSEC4 - LD A,C ;is desired sector now before current one? - SUB L - LD A,B - SBC A,H - JP C,TRKSEC4 - EX DE,HL ;not yes, increment track counter - POP HL ;and continue until it is. - INC HL - JP TRKSEC3 -; -; here we have determined the track number that contains the -; desired sector. -; -TRKSEC4:POP HL ;get track number (HL). - PUSH BC - PUSH DE - PUSH HL - EX DE,HL - LD HL,(OFFSET) ;adjust for first track offset. - ADD HL,DE - LD B,H - LD C,L - CALL SETTRK ;select this track. - POP DE ;reset current track pointer. - LD HL,(SCRATCH2) - LD (HL),E - INC HL - LD (HL),D - POP DE - LD HL,(SCRATCH3) ;reset the first sector on this track. - LD (HL),E - INC HL - LD (HL),D - POP BC - LD A,C ;now subtract the desired one. - SUB E ;to make it relative (1-# sectors/track). - LD C,A - LD A,B - SBC A,D - LD B,A - LD HL,(XLATE) ;translate this sector according to this table. - EX DE,HL - CALL SECTRN ;let the bios translate it. - LD C,L - LD B,H - JP SETSEC ;and select it. -; -; Compute block number from record number (SAVNREC) and -; extent number (SAVEXT). -; -GETBLOCK: LD HL,BLKSHFT ;get logical to physical conversion. - LD C,(HL) ;note that this is base 2 log of ratio. - LD A,(SAVNREC) ;get record number. -GETBLK1:OR A ;compute (A)=(A)/2^BLKSHFT. - RRA - DEC C - JP NZ,GETBLK1 - LD B,A ;save result in (B). - LD A,8 - SUB (HL) - LD C,A ;compute (C)=8-BLKSHFT. - LD A,(SAVEXT) -GETBLK2:DEC C ;compute (A)=SAVEXT*2^(8-BLKSHFT). - JP Z,GETBLK3 - OR A - RLA - JP GETBLK2 -GETBLK3:ADD A,B - RET -; -; Routine to extract the (BC) block byte from the fcb pointed -; to by (PARAMS). If this is a big-disk, then these are 16 bit -; block numbers, else they are 8 bit numbers. -; Number is returned in (HL). -; -EXTBLK: LD HL,(PARAMS) ;get fcb address. - LD DE,16 ;block numbers start 16 bytes into fcb. - ADD HL,DE - ADD HL,BC - LD A,(BIGDISK) ;are we using a big-disk? - OR A - JP Z,EXTBLK1 - LD L,(HL) ;no, extract an 8 bit number from the fcb. - LD H,0 - RET -EXTBLK1:ADD HL,BC ;yes, extract a 16 bit number. - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL ;return in (HL). - RET -; -; Compute block number. -; -COMBLK: CALL GETBLOCK - LD C,A - LD B,0 - CALL EXTBLK - LD (BLKNMBR),HL - RET -; -; Check for a zero block number (unused). -; -CHKBLK: LD HL,(BLKNMBR) - LD A,L ;is it zero? - OR H - RET -; -; Adjust physical block (BLKNMBR) and convert to logical -; sector (LOGSECT). This is the starting sector of this block. -; The actual sector of interest is then added to this and the -; resulting sector number is stored back in (BLKNMBR). This -; will still have to be adjusted for the track number. -; -LOGICAL:LD A,(BLKSHFT) ;get log2(physical/logical sectors). - LD HL,(BLKNMBR) ;get physical sector desired. -LOGICL1:ADD HL,HL ;compute logical sector number. - DEC A ;note logical sectors are 128 bytes long. - JP NZ,LOGICL1 - LD (LOGSECT),HL ;save logical sector. - LD A,(BLKMASK) ;get block mask. - LD C,A - LD A,(SAVNREC) ;get next sector to access. - AND C ;extract the relative position within physical block. - OR L ;and add it too logical sector. - LD L,A - LD (BLKNMBR),HL ;and store. - RET -; -; Set (HL) to point to extent byte in fcb. -; -SETEXT: LD HL,(PARAMS) - LD DE,12 ;it is the twelth byte. - ADD HL,DE - RET -; -; Set (HL) to point to record count byte in fcb and (DE) to -; next record number byte. -; -SETHLDE:LD HL,(PARAMS) - LD DE,15 ;record count byte (#15). - ADD HL,DE - EX DE,HL - LD HL,17 ;next record number (#32). - ADD HL,DE - RET -; -; Save current file data from fcb. -; -STRDATA:CALL SETHLDE - LD A,(HL) ;get and store record count byte. - LD (SAVNREC),A - EX DE,HL - LD A,(HL) ;get and store next record number byte. - LD (SAVNXT),A - CALL SETEXT ;point to extent byte. - LD A,(EXTMASK) ;get extent mask. - AND (HL) - LD (SAVEXT),A ;and save extent here. - RET -; -; Set the next record to access. If (MODE) is set to 2, then -; the last record byte (SAVNREC) has the correct number to access. -; For sequential access, (MODE) will be equal to 1. -; -SETNREC:CALL SETHLDE - LD A,(MODE) ;get sequential flag (=1). - CP 2 ;a 2 indicates that no adder is needed. - JP NZ,STNREC1 - XOR A ;clear adder (random access?). -STNREC1:LD C,A - LD A,(SAVNREC) ;get last record number. - ADD A,C ;increment record count. - LD (HL),A ;and set fcb's next record byte. - EX DE,HL - LD A,(SAVNXT) ;get next record byte from storage. - LD (HL),A ;and put this into fcb as number of records used. - RET -; -; Shift (HL) right (C) bits. -; -SHIFTR: INC C -SHIFTR1:DEC C - RET Z - LD A,H - OR A - RRA - LD H,A - LD A,L - RRA - LD L,A - JP SHIFTR1 -; -; Compute the check-sum for the directory buffer. Return -; integer sum in (A). -; -CHECKSUM: LD C,128 ;length of buffer. - LD HL,(DIRBUF) ;get its location. - XOR A ;clear summation byte. -CHKSUM1:ADD A,(HL) ;and compute sum ignoring carries. - INC HL - DEC C - JP NZ,CHKSUM1 - RET -; -; Shift (HL) left (C) bits. -; -SHIFTL: INC C -SHIFTL1:DEC C - RET Z - ADD HL,HL ;shift left 1 bit. - JP SHIFTL1 -; -; Routine to set a bit in a 16 bit value contained in (BC). -; The bit set depends on the current drive selection. -; -SETBIT: PUSH BC ;save 16 bit word. - LD A,(ACTIVE) ;get active drive. - LD C,A - LD HL,1 - CALL SHIFTL ;shift bit 0 into place. - POP BC ;now 'or' this with the original word. - LD A,C - OR L - LD L,A ;low byte done, do high byte. - LD A,B - OR H - LD H,A - RET -; -; Extract the write protect status bit for the current drive. -; The result is returned in (A), bit 0. -; -GETWPRT:LD HL,(WRTPRT) ;get status bytes. - LD A,(ACTIVE) ;which drive is current? - LD C,A - CALL SHIFTR ;shift status such that bit 0 is the - LD A,L ;one of interest for this drive. - AND 01H ;and isolate it. - RET -; -; Function to write protect the current disk. -; -WRTPRTD:LD HL,WRTPRT ;point to status word. - LD C,(HL) ;set (BC) equal to the status. - INC HL - LD B,(HL) - CALL SETBIT ;and set this bit according to current drive. - LD (WRTPRT),HL ;then save. - LD HL,(DIRSIZE) ;now save directory size limit. - INC HL ;remember the last one. - EX DE,HL - LD HL,(SCRATCH1) ;and store it here. - LD (HL),E ;put low byte. - INC HL - LD (HL),D ;then high byte. - RET -; -; Check for a read only file. -; -CHKROFL:CALL FCB2HL ;set (HL) to file entry in directory buffer. -CKROF1: LD DE,9 ;look at bit 7 of the ninth byte. - ADD HL,DE - LD A,(HL) - RLA - RET NC ;return if ok. - LD HL,ROFILE ;else, print error message and terminate. - JP JUMPHL -; -; Check the write protect status of the active disk. -; -CHKWPRT:CALL GETWPRT - RET Z ;return if ok. - LD HL,RODISK ;else print message and terminate. - JP JUMPHL -; -; Routine to set (HL) pointing to the proper entry in the -; directory buffer. -; -FCB2HL: LD HL,(DIRBUF) ;get address of buffer. - LD A,(FCBPOS) ;relative position of file. -; -; Routine to add (A) to (HL). -; -ADDA2HL:ADD A,L - LD L,A - RET NC - INC H ;take care of any carry. - RET -; -; Routine to get the 's2' byte from the fcb supplied in -; the initial parameter specification. -; -GETS2: LD HL,(PARAMS) ;get address of fcb. - LD DE,14 ;relative position of 's2'. - ADD HL,DE - LD A,(HL) ;extract this byte. - RET -; -; Clear the 's2' byte in the fcb. -; -CLEARS2:CALL GETS2 ;this sets (HL) pointing to it. - LD (HL),0 ;now clear it. - RET -; -; Set bit 7 in the 's2' byte of the fcb. -; -SETS2B7:CALL GETS2 ;get the byte. - OR 80H ;and set bit 7. - LD (HL),A ;then store. - RET -; -; Compare (FILEPOS) with (SCRATCH1) and set flags based on -; the difference. This checks to see if there are more file -; names in the directory. We are at (FILEPOS) and there are -; (SCRATCH1) of them to check. -; -MOREFLS:LD HL,(FILEPOS) ;we are here. - EX DE,HL - LD HL,(SCRATCH1) ;and don't go past here. - LD A,E ;compute difference but don't keep. - SUB (HL) - INC HL - LD A,D - SBC A,(HL) ;set carry if no more names. - RET -; -; Call this routine to prevent (SCRATCH1) from being greater -; than (FILEPOS). -; -CHKNMBR:CALL MOREFLS ;SCRATCH1 too big? - RET C - INC DE ;yes, reset it to (FILEPOS). - LD (HL),D - DEC HL - LD (HL),E - RET -; -; Compute (HL)=(DE)-(HL) -; -SUBHL: LD A,E ;compute difference. - SUB L - LD L,A ;store low byte. - LD A,D - SBC A,H - LD H,A ;and then high byte. - RET -; -; Set the directory checksum byte. -; -SETDIR: LD C,0FFH -; -; Routine to set or compare the directory checksum byte. If -; (C)=0ffh, then this will set the checksum byte. Else the byte -; will be checked. If the check fails (the disk has been changed), -; then this disk will be write protected. -; -CHECKDIR: LD HL,(CKSUMTBL) - EX DE,HL - LD HL,(ALLOC1) - CALL SUBHL - RET NC ;ok if (CKSUMTBL) > (ALLOC1), so return. - PUSH BC - CALL CHECKSUM ;else compute checksum. - LD HL,(CHKVECT) ;get address of checksum table. - EX DE,HL - LD HL,(CKSUMTBL) - ADD HL,DE ;set (HL) to point to byte for this drive. - POP BC - INC C ;set or check ? - JP Z,CHKDIR1 - CP (HL) ;check them. - RET Z ;return if they are the same. - CALL MOREFLS ;not the same, do we care? - RET NC - CALL WRTPRTD ;yes, mark this as write protected. - RET -CHKDIR1:LD (HL),A ;just set the byte. - RET -; -; Do a write to the directory of the current disk. -; -DIRWRITE: CALL SETDIR ;set checksum byte. - CALL DIRDMA ;set directory dma address. - LD C,1 ;tell the bios to actually write. - CALL DOWRITE ;then do the write. - JP DEFDMA -; -; Read from the directory. -; -DIRREAD:CALL DIRDMA ;set the directory dma address. - CALL DOREAD ;and read it. -; -; Routine to set the dma address to the users choice. -; -DEFDMA: LD HL,USERDMA ;reset the default dma address and return. - JP DIRDMA1 -; -; Routine to set the dma address for directory work. -; -DIRDMA: LD HL,DIRBUF -; -; Set the dma address. On entry, (HL) points to -; word containing the desired dma address. -; -DIRDMA1:LD C,(HL) - INC HL - LD B,(HL) ;setup (BC) and go to the bios to set it. - JP SETDMA -; -; Move the directory buffer into user's dma space. -; -MOVEDIR:LD HL,(DIRBUF) ;buffer is located here, and - EX DE,HL - LD HL,(USERDMA) ; put it here. - LD C,128 ;this is its length. - JP DE2HL ;move it now and return. -; -; Check (FILEPOS) and set the zero flag if it equals 0ffffh. -; -CKFILPOS: LD HL,FILEPOS - LD A,(HL) - INC HL - CP (HL) ;are both bytes the same? - RET NZ - INC A ;yes, but are they each 0ffh? - RET -; -; Set location (FILEPOS) to 0ffffh. -; -STFILPOS: LD HL,0FFFFH - LD (FILEPOS),HL - RET -; -; Move on to the next file position within the current -; directory buffer. If no more exist, set pointer to 0ffffh -; and the calling routine will check for this. Enter with (C) -; equal to 0ffh to cause the checksum byte to be set, else we -; will check this disk and set write protect if checksums are -; not the same (applies only if another directory sector must -; be read). -; -NXENTRY:LD HL,(DIRSIZE) ;get directory entry size limit. - EX DE,HL - LD HL,(FILEPOS) ;get current count. - INC HL ;go on to the next one. - LD (FILEPOS),HL - CALL SUBHL ;(HL)=(DIRSIZE)-(FILEPOS) - JP NC,NXENT1 ;is there more room left? - JP STFILPOS ;no. Set this flag and return. -NXENT1: LD A,(FILEPOS) ;get file position within directory. - AND 03H ;only look within this sector (only 4 entries fit). - LD B,5 ;convert to relative position (32 bytes each). -NXENT2: ADD A,A ;note that this is not efficient code. - DEC B ;5 'ADD A's would be better. - JP NZ,NXENT2 - LD (FCBPOS),A ;save it as position of fcb. - OR A - RET NZ ;return if we are within buffer. - PUSH BC - CALL TRKSEC ;we need the next directory sector. - CALL DIRREAD - POP BC - JP CHECKDIR -; -; Routine to to get a bit from the disk space allocation -; map. It is returned in (A), bit position 0. On entry to here, -; set (BC) to the block number on the disk to check. -; On return, (D) will contain the original bit position for -; this block number and (HL) will point to the address for it. -; -CKBITMAP: LD A,C ;determine bit number of interest. - AND 07H ;compute (D)=(E)=(C and 7)+1. - INC A - LD E,A ;save particular bit number. - LD D,A -; -; compute (BC)=(BC)/8. -; - LD A,C - RRCA ;now shift right 3 bits. - RRCA - RRCA - AND 1FH ;and clear bits 7,6,5. - LD C,A - LD A,B - ADD A,A ;now shift (B) into bits 7,6,5. - ADD A,A - ADD A,A - ADD A,A - ADD A,A - OR C ;and add in (C). - LD C,A ;ok, (C) ha been completed. - LD A,B ;is there a better way of doing this? - RRCA - RRCA - RRCA - AND 1FH - LD B,A ;and now (B) is completed. -; -; use this as an offset into the disk space allocation -; table. -; - LD HL,(ALOCVECT) - ADD HL,BC - LD A,(HL) ;now get correct byte. -CKBMAP1:RLCA ;get correct bit into position 0. - DEC E - JP NZ,CKBMAP1 - RET -; -; Set or clear the bit map such that block number (BC) will be marked -; as used. On entry, if (E)=0 then this bit will be cleared, if it equals -; 1 then it will be set (don't use anyother values). -; -STBITMAP: PUSH DE - CALL CKBITMAP ;get the byte of interest. - AND 0FEH ;clear the affected bit. - POP BC - OR C ;and now set it acording to (C). -; -; entry to restore the original bit position and then store -; in table. (A) contains the value, (D) contains the bit -; position (1-8), and (HL) points to the address within the -; space allocation table for this byte. -; -STBMAP1:RRCA ;restore original bit position. - DEC D - JP NZ,STBMAP1 - LD (HL),A ;and stor byte in table. - RET -; -; Set/clear space used bits in allocation map for this file. -; On entry, (C)=1 to set the map and (C)=0 to clear it. -; -SETFILE:CALL FCB2HL ;get address of fcb - LD DE,16 - ADD HL,DE ;get to block number bytes. - PUSH BC - LD C,17 ;check all 17 bytes (max) of table. -SETFL1: POP DE - DEC C ;done all bytes yet? - RET Z - PUSH DE - LD A,(BIGDISK) ;check disk size for 16 bit block numbers. - OR A - JP Z,SETFL2 - PUSH BC ;only 8 bit numbers. set (BC) to this one. - PUSH HL - LD C,(HL) ;get low byte from table, always - LD B,0 ;set high byte to zero. - JP SETFL3 -SETFL2: DEC C ;for 16 bit block numbers, adjust counter. - PUSH BC - LD C,(HL) ;now get both the low and high bytes. - INC HL - LD B,(HL) - PUSH HL -SETFL3: LD A,C ;block used? - OR B - JP Z,SETFL4 - LD HL,(DSKSIZE) ;is this block number within the - LD A,L ;space on the disk? - SUB C - LD A,H - SBC A,B - CALL NC,STBITMAP ;yes, set the proper bit. -SETFL4: POP HL ;point to next block number in fcb. - INC HL - POP BC - JP SETFL1 -; -; Construct the space used allocation bit map for the active -; drive. If a file name starts with '$' and it is under the -; current user number, then (STATUS) is set to minus 1. Otherwise -; it is not set at all. -; -BITMAP: LD HL,(DSKSIZE) ;compute size of allocation table. - LD C,3 - CALL SHIFTR ;(HL)=(HL)/8. - INC HL ;at lease 1 byte. - LD B,H - LD C,L ;set (BC) to the allocation table length. -; -; Initialize the bitmap for this drive. Right now, the first -; two bytes are specified by the disk parameter block. However -; a patch could be entered here if it were necessary to setup -; this table in a special mannor. For example, the bios could -; determine locations of 'bad blocks' and set them as already -; 'used' in the map. -; - LD HL,(ALOCVECT) ;now zero out the table now. -BITMAP1:LD (HL),0 - INC HL - DEC BC - LD A,B - OR C - JP NZ,BITMAP1 - LD HL,(ALLOC0) ;get initial space used by directory. - EX DE,HL - LD HL,(ALOCVECT) ;and put this into map. - LD (HL),E - INC HL - LD (HL),D -; -; End of initialization portion. -; - CALL HOMEDRV ;now home the drive. - LD HL,(SCRATCH1) - LD (HL),3 ;force next directory request to read - INC HL ;in a sector. - LD (HL),0 - CALL STFILPOS ;clear initial file position also. -BITMAP2:LD C,0FFH ;read next file name in directory - CALL NXENTRY ;and set checksum byte. - CALL CKFILPOS ;is there another file? - RET Z - CALL FCB2HL ;yes, get its address. - LD A,0E5H - CP (HL) ;empty file entry? - JP Z,BITMAP2 - LD A,(USERNO) ;no, correct user number? - CP (HL) - JP NZ,BITMAP3 - INC HL - LD A,(HL) ;yes, does name start with a '$'? - SUB '$' - JP NZ,BITMAP3 - DEC A ;yes, set atatus to minus one. - LD (STATUS),A -BITMAP3:LD C,1 ;now set this file's space as used in bit map. - CALL SETFILE - CALL CHKNMBR ;keep (SCRATCH1) in bounds. - JP BITMAP2 -; -; Set the status (STATUS) and return. -; -STSTATUS: LD A,(FNDSTAT) - JP SETSTAT -; -; Check extents in (A) and (C). Set the zero flag if they -; are the same. The number of 16k chunks of disk space that -; the directory extent covers is expressad is (EXTMASK+1). -; No registers are modified. -; -SAMEXT: PUSH BC - PUSH AF - LD A,(EXTMASK) ;get extent mask and use it to - CPL ;to compare both extent numbers. - LD B,A ;save resulting mask here. - LD A,C ;mask first extent and save in (C). - AND B - LD C,A - POP AF ;now mask second extent and compare - AND B ;with the first one. - SUB C - AND 1FH ;(* only check buts 0-4 *) - POP BC ;the zero flag is set if they are the same. - RET ;restore (BC) and return. -; -; Search for the first occurence of a file name. On entry, -; register (C) should contain the number of bytes of the fcb -; that must match. -; -FINDFST:LD A,0FFH - LD (FNDSTAT),A - LD HL,COUNTER ;save character count. - LD (HL),C - LD HL,(PARAMS) ;get filename to match. - LD (SAVEFCB),HL ;and save. - CALL STFILPOS ;clear initial file position (set to 0ffffh). - CALL HOMEDRV ;home the drive. -; -; Entry to locate the next occurence of a filename within the -; directory. The disk is not expected to have been changed. If -; it was, then it will be write protected. -; -FINDNXT:LD C,0 ;write protect the disk if changed. - CALL NXENTRY ;get next filename entry in directory. - CALL CKFILPOS ;is file position = 0ffffh? - JP Z,FNDNXT6 ;yes, exit now then. - LD HL,(SAVEFCB) ;set (DE) pointing to filename to match. - EX DE,HL - LD A,(DE) - CP 0E5H ;empty directory entry? - JP Z,FNDNXT1 ;(* are we trying to reserect erased entries? *) - PUSH DE - CALL MOREFLS ;more files in directory? - POP DE - JP NC,FNDNXT6 ;no more. Exit now. -FNDNXT1:CALL FCB2HL ;get address of this fcb in directory. - LD A,(COUNTER) ;get number of bytes (characters) to check. - LD C,A - LD B,0 ;initialize byte position counter. -FNDNXT2:LD A,C ;are we done with the compare? - OR A - JP Z,FNDNXT5 - LD A,(DE) ;no, check next byte. - CP '?' ;don't care about this character? - JP Z,FNDNXT4 - LD A,B ;get bytes position in fcb. - CP 13 ;don't care about the thirteenth byte either. - JP Z,FNDNXT4 - CP 12 ;extent byte? - LD A,(DE) - JP Z,FNDNXT3 - SUB (HL) ;otherwise compare characters. - AND 7FH - JP NZ,FINDNXT ;not the same, check next entry. - JP FNDNXT4 ;so far so good, keep checking. -FNDNXT3:PUSH BC ;check the extent byte here. - LD C,(HL) - CALL SAMEXT - POP BC - JP NZ,FINDNXT ;not the same, look some more. -; -; So far the names compare. Bump pointers to the next byte -; and continue until all (C) characters have been checked. -; -FNDNXT4:INC DE ;bump pointers. - INC HL - INC B - DEC C ;adjust character counter. - JP FNDNXT2 -FNDNXT5:LD A,(FILEPOS) ;return the position of this entry. - AND 03H - LD (STATUS),A - LD HL,FNDSTAT - LD A,(HL) - RLA - RET NC - XOR A - LD (HL),A - RET -; -; Filename was not found. Set appropriate status. -; -FNDNXT6:CALL STFILPOS ;set (FILEPOS) to 0ffffh. - LD A,0FFH ;say not located. - JP SETSTAT -; -; Erase files from the directory. Only the first byte of the -; fcb will be affected. It is set to (E5). -; -ERAFILE:CALL CHKWPRT ;is disk write protected? - LD C,12 ;only compare file names. - CALL FINDFST ;get first file name. -ERAFIL1:CALL CKFILPOS ;any found? - RET Z ;nope, we must be done. - CALL CHKROFL ;is file read only? - CALL FCB2HL ;nope, get address of fcb and - LD (HL),0E5H ;set first byte to 'empty'. - LD C,0 ;clear the space from the bit map. - CALL SETFILE - CALL DIRWRITE ;now write the directory sector back out. - CALL FINDNXT ;find the next file name. - JP ERAFIL1 ;and repeat process. -; -; Look through the space allocation map (bit map) for the -; next available block. Start searching at block number (BC-1). -; The search procedure is to look for an empty block that is -; before the starting block. If not empty, look at a later -; block number. In this way, we return the closest empty block -; on either side of the 'target' block number. This will speed -; access on random devices. For serial devices, this should be -; changed to look in the forward direction first and then start -; at the front and search some more. -; -; On return, (DE)= block number that is empty and (HL) =0 -; if no empry block was found. -; -FNDSPACE: LD D,B ;set (DE) as the block that is checked. - LD E,C -; -; Look before target block. Registers (BC) are used as the lower -; pointer and (DE) as the upper pointer. -; -FNDSPA1:LD A,C ;is block 0 specified? - OR B - JP Z,FNDSPA2 - DEC BC ;nope, check previous block. - PUSH DE - PUSH BC - CALL CKBITMAP - RRA ;is this block empty? - JP NC,FNDSPA3 ;yes. use this. -; -; Note that the above logic gets the first block that it finds -; that is empty. Thus a file could be written 'backward' making -; it very slow to access. This could be changed to look for the -; first empty block and then continue until the start of this -; empty space is located and then used that starting block. -; This should help speed up access to some files especially on -; a well used disk with lots of fairly small 'holes'. -; - POP BC ;nope, check some more. - POP DE -; -; Now look after target block. -; -FNDSPA2:LD HL,(DSKSIZE) ;is block (DE) within disk limits? - LD A,E - SUB L - LD A,D - SBC A,H - JP NC,FNDSPA4 - INC DE ;yes, move on to next one. - PUSH BC - PUSH DE - LD B,D - LD C,E - CALL CKBITMAP ;check it. - RRA ;empty? - JP NC,FNDSPA3 - POP DE ;nope, continue searching. - POP BC - JP FNDSPA1 -; -; Empty block found. Set it as used and return with (HL) -; pointing to it (true?). -; -FNDSPA3:RLA ;reset byte. - INC A ;and set bit 0. - CALL STBMAP1 ;update bit map. - POP HL ;set return registers. - POP DE - RET -; -; Free block was not found. If (BC) is not zero, then we have -; not checked all of the disk space. -; -FNDSPA4:LD A,C - OR B - JP NZ,FNDSPA1 - LD HL,0 ;set 'not found' status. - RET -; -; Move a complete fcb entry into the directory and write it. -; -FCBSET: LD C,0 - LD E,32 ;length of each entry. -; -; Move (E) bytes from the fcb pointed to by (PARAMS) into -; fcb in directory starting at relative byte (C). This updated -; directory buffer is then written to the disk. -; -UPDATE: PUSH DE - LD B,0 ;set (BC) to relative byte position. - LD HL,(PARAMS) ;get address of fcb. - ADD HL,BC ;compute starting byte. - EX DE,HL - CALL FCB2HL ;get address of fcb to update in directory. - POP BC ;set (C) to number of bytes to change. - CALL DE2HL -UPDATE1:CALL TRKSEC ;determine the track and sector affected. - JP DIRWRITE ;then write this sector out. -; -; Routine to change the name of all files on the disk with a -; specified name. The fcb contains the current name as the -; first 12 characters and the new name 16 bytes into the fcb. -; -CHGNAMES: CALL CHKWPRT ;check for a write protected disk. - LD C,12 ;match first 12 bytes of fcb only. - CALL FINDFST ;get first name. - LD HL,(PARAMS) ;get address of fcb. - LD A,(HL) ;get user number. - LD DE,16 ;move over to desired name. - ADD HL,DE - LD (HL),A ;keep same user number. -CHGNAM1:CALL CKFILPOS ;any matching file found? - RET Z ;no, we must be done. - CALL CHKROFL ;check for read only file. - LD C,16 ;start 16 bytes into fcb. - LD E,12 ;and update the first 12 bytes of directory. - CALL UPDATE - CALL FINDNXT ;get te next file name. - JP CHGNAM1 ;and continue. -; -; Update a files attributes. The procedure is to search for -; every file with the same name as shown in fcb (ignoring bit 7) -; and then to update it (which includes bit 7). No other changes -; are made. -; -SAVEATTR: LD C,12 ;match first 12 bytes. - CALL FINDFST ;look for first filename. -SAVATR1:CALL CKFILPOS ;was one found? - RET Z ;nope, we must be done. - LD C,0 ;yes, update the first 12 bytes now. - LD E,12 - CALL UPDATE ;update filename and write directory. - CALL FINDNXT ;and get the next file. - JP SAVATR1 ;then continue until done. -; -; Open a file (name specified in fcb). -; -OPENIT: LD C,15 ;compare the first 15 bytes. - CALL FINDFST ;get the first one in directory. - CALL CKFILPOS ;any at all? - RET Z -OPENIT1:CALL SETEXT ;point to extent byte within users fcb. - LD A,(HL) ;and get it. - PUSH AF ;save it and address. - PUSH HL - CALL FCB2HL ;point to fcb in directory. - EX DE,HL - LD HL,(PARAMS) ;this is the users copy. - LD C,32 ;move it into users space. - PUSH DE - CALL DE2HL - CALL SETS2B7 ;set bit 7 in 's2' byte (unmodified). - POP DE ;now get the extent byte from this fcb. - LD HL,12 - ADD HL,DE - LD C,(HL) ;into (C). - LD HL,15 ;now get the record count byte into (B). - ADD HL,DE - LD B,(HL) - POP HL ;keep the same extent as the user had originally. - POP AF - LD (HL),A - LD A,C ;is it the same as in the directory fcb? - CP (HL) - LD A,B ;if yes, then use the same record count. - JP Z,OPENIT2 - LD A,0 ;if the user specified an extent greater than - JP C,OPENIT2 ;the one in the directory, then set record count to 0. - LD A,128 ;otherwise set to maximum. -OPENIT2:LD HL,(PARAMS) ;set record count in users fcb to (A). - LD DE,15 - ADD HL,DE ;compute relative position. - LD (HL),A ;and set the record count. - RET -; -; Move two bytes from (DE) to (HL) if (and only if) (HL) -; point to a zero value (16 bit). -; Return with zero flag set it (DE) was moved. Registers (DE) -; and (HL) are not changed. However (A) is. -; -MOVEWORD: LD A,(HL) ;check for a zero word. - INC HL - OR (HL) ;both bytes zero? - DEC HL - RET NZ ;nope, just return. - LD A,(DE) ;yes, move two bytes from (DE) into - LD (HL),A ;this zero space. - INC DE - INC HL - LD A,(DE) - LD (HL),A - DEC DE ;don't disturb these registers. - DEC HL - RET -; -; Get here to close a file specified by (fcb). -; -CLOSEIT:XOR A ;clear status and file position bytes. - LD (STATUS),A - LD (FILEPOS),A - LD (FILEPOS+1),A - CALL GETWPRT ;get write protect bit for this drive. - RET NZ ;just return if it is set. - CALL GETS2 ;else get the 's2' byte. - AND 80H ;and look at bit 7 (file unmodified?). - RET NZ ;just return if set. - LD C,15 ;else look up this file in directory. - CALL FINDFST - CALL CKFILPOS ;was it found? - RET Z ;just return if not. - LD BC,16 ;set (HL) pointing to records used section. - CALL FCB2HL - ADD HL,BC - EX DE,HL - LD HL,(PARAMS) ;do the same for users specified fcb. - ADD HL,BC - LD C,16 ;this many bytes are present in this extent. -CLOSEIT1: LD A,(BIGDISK) ;8 or 16 bit record numbers? - OR A - JP Z,CLOSEIT4 - LD A,(HL) ;just 8 bit. Get one from users fcb. - OR A - LD A,(DE) ;now get one from directory fcb. - JP NZ,CLOSEIT2 - LD (HL),A ;users byte was zero. Update from directory. -CLOSEIT2: OR A - JP NZ,CLOSEIT3 - LD A,(HL) ;directories byte was zero, update from users fcb. - LD (DE),A -CLOSEIT3: CP (HL) ;if neither one of these bytes were zero, - JP NZ,CLOSEIT7 ;then close error if they are not the same. - JP CLOSEIT5 ;ok so far, get to next byte in fcbs. -CLOSEIT4: CALL MOVEWORD ;update users fcb if it is zero. - EX DE,HL - CALL MOVEWORD ;update directories fcb if it is zero. - EX DE,HL - LD A,(DE) ;if these two values are no different, - CP (HL) ;then a close error occured. - JP NZ,CLOSEIT7 - INC DE ;check second byte. - INC HL - LD A,(DE) - CP (HL) - JP NZ,CLOSEIT7 - DEC C ;remember 16 bit values. -CLOSEIT5: INC DE ;bump to next item in table. - INC HL - DEC C ;there are 16 entries only. - JP NZ,CLOSEIT1 ;continue if more to do. - LD BC,0FFECH ;backup 20 places (extent byte). - ADD HL,BC - EX DE,HL - ADD HL,BC - LD A,(DE) - CP (HL) ;directory's extent already greater than the - JP C,CLOSEIT6 ;users extent? - LD (HL),A ;no, update directory extent. - LD BC,3 ;and update the record count byte in - ADD HL,BC ;directories fcb. - EX DE,HL - ADD HL,BC - LD A,(HL) ;get from user. - LD (DE),A ;and put in directory. -CLOSEIT6: LD A,0FFH ;set 'was open and is now closed' byte. - LD (CLOSEFLG),A - JP UPDATE1 ;update the directory now. -CLOSEIT7: LD HL,STATUS ;set return status and then return. - DEC (HL) - RET -; -; Routine to get the next empty space in the directory. It -; will then be cleared for use. -; -GETEMPTY: CALL CHKWPRT ;make sure disk is not write protected. - LD HL,(PARAMS) ;save current parameters (fcb). - PUSH HL - LD HL,EMPTYFCB ;use special one for empty space. - LD (PARAMS),HL - LD C,1 ;search for first empty spot in directory. - CALL FINDFST ;(* only check first byte *) - CALL CKFILPOS ;none? - POP HL - LD (PARAMS),HL ;restore original fcb address. - RET Z ;return if no more space. - EX DE,HL - LD HL,15 ;point to number of records for this file. - ADD HL,DE - LD C,17 ;and clear all of this space. - XOR A -GETMT1: LD (HL),A - INC HL - DEC C - JP NZ,GETMT1 - LD HL,13 ;clear the 's1' byte also. - ADD HL,DE - LD (HL),A - CALL CHKNMBR ;keep (SCRATCH1) within bounds. - CALL FCBSET ;write out this fcb entry to directory. - JP SETS2B7 ;set 's2' byte bit 7 (unmodified at present). -; -; Routine to close the current extent and open the next one -; for reading. -; -GETNEXT:XOR A - LD (CLOSEFLG),A ;clear close flag. - CALL CLOSEIT ;close this extent. - CALL CKFILPOS - RET Z ;not there??? - LD HL,(PARAMS) ;get extent byte. - LD BC,12 - ADD HL,BC - LD A,(HL) ;and increment it. - INC A - AND 1FH ;keep within range 0-31. - LD (HL),A - JP Z,GTNEXT1 ;overflow? - LD B,A ;mask extent byte. - LD A,(EXTMASK) - AND B - LD HL,CLOSEFLG ;check close flag (0ffh is ok). - AND (HL) - JP Z,GTNEXT2 ;if zero, we must read in next extent. - JP GTNEXT3 ;else, it is already in memory. -GTNEXT1:LD BC,2 ;Point to the 's2' byte. - ADD HL,BC - INC (HL) ;and bump it. - LD A,(HL) ;too many extents? - AND 0FH - JP Z,GTNEXT5 ;yes, set error code. -; -; Get here to open the next extent. -; -GTNEXT2:LD C,15 ;set to check first 15 bytes of fcb. - CALL FINDFST ;find the first one. - CALL CKFILPOS ;none available? - JP NZ,GTNEXT3 - LD A,(RDWRTFLG) ;no extent present. Can we open an empty one? - INC A ;0ffh means reading (so not possible). - JP Z,GTNEXT5 ;or an error. - CALL GETEMPTY ;we are writing, get an empty entry. - CALL CKFILPOS ;none? - JP Z,GTNEXT5 ;error if true. - JP GTNEXT4 ;else we are almost done. -GTNEXT3:CALL OPENIT1 ;open this extent. -GTNEXT4:CALL STRDATA ;move in updated data (rec #, extent #, etc.) - XOR A ;clear status and return. - JP SETSTAT -; -; Error in extending the file. Too many extents were needed -; or not enough space on the disk. -; -GTNEXT5:CALL IOERR1 ;set error code, clear bit 7 of 's2' - JP SETS2B7 ;so this is not written on a close. -; -; Read a sequential file. -; -RDSEQ: LD A,1 ;set sequential access mode. - LD (MODE),A -RDSEQ1: LD A,0FFH ;don't allow reading unwritten space. - LD (RDWRTFLG),A - CALL STRDATA ;put rec# and ext# into fcb. - LD A,(SAVNREC) ;get next record to read. - LD HL,SAVNXT ;get number of records in extent. - CP (HL) ;within this extent? - JP C,RDSEQ2 - CP 128 ;no. Is this extent fully used? - JP NZ,RDSEQ3 ;no. End-of-file. - CALL GETNEXT ;yes, open the next one. - XOR A ;reset next record to read. - LD (SAVNREC),A - LD A,(STATUS) ;check on open, successful? - OR A - JP NZ,RDSEQ3 ;no, error. -RDSEQ2: CALL COMBLK ;ok. compute block number to read. - CALL CHKBLK ;check it. Within bounds? - JP Z,RDSEQ3 ;no, error. - CALL LOGICAL ;convert (BLKNMBR) to logical sector (128 byte). - CALL TRKSEC1 ;set the track and sector for this block #. - CALL DOREAD ;and read it. - JP SETNREC ;and set the next record to be accessed. -; -; Read error occured. Set status and return. -; -RDSEQ3: JP IOERR1 -; -; Write the next sequential record. -; -WTSEQ: LD A,1 ;set sequential access mode. - LD (MODE),A -WTSEQ1: LD A,0 ;allow an addition empty extent to be opened. - LD (RDWRTFLG),A - CALL CHKWPRT ;check write protect status. - LD HL,(PARAMS) - CALL CKROF1 ;check for read only file, (HL) already set to fcb. - CALL STRDATA ;put updated data into fcb. - LD A,(SAVNREC) ;get record number to write. - CP 128 ;within range? - JP NC,IOERR1 ;no, error(?). - CALL COMBLK ;compute block number. - CALL CHKBLK ;check number. - LD C,0 ;is there one to write to? - JP NZ,WTSEQ6 ;yes, go do it. - CALL GETBLOCK ;get next block number within fcb to use. - LD (RELBLOCK),A ;and save. - LD BC,0 ;start looking for space from the start - OR A ;if none allocated as yet. - JP Z,WTSEQ2 - LD C,A ;extract previous block number from fcb - DEC BC ;so we can be closest to it. - CALL EXTBLK - LD B,H - LD C,L -WTSEQ2: CALL FNDSPACE ;find the next empty block nearest number (BC). - LD A,L ;check for a zero number. - OR H - JP NZ,WTSEQ3 - LD A,2 ;no more space? - JP SETSTAT -WTSEQ3: LD (BLKNMBR),HL ;save block number to access. - EX DE,HL ;put block number into (DE). - LD HL,(PARAMS) ;now we must update the fcb for this - LD BC,16 ;newly allocated block. - ADD HL,BC - LD A,(BIGDISK) ;8 or 16 bit block numbers? - OR A - LD A,(RELBLOCK) ;(* update this entry *) - JP Z,WTSEQ4 ;zero means 16 bit ones. - CALL ADDA2HL ;(HL)=(HL)+(A) - LD (HL),E ;store new block number. - JP WTSEQ5 -WTSEQ4: LD C,A ;compute spot in this 16 bit table. - LD B,0 - ADD HL,BC - ADD HL,BC - LD (HL),E ;stuff block number (DE) there. - INC HL - LD (HL),D -WTSEQ5: LD C,2 ;set (C) to indicate writing to un-used disk space. -WTSEQ6: LD A,(STATUS) ;are we ok so far? - OR A - RET NZ - PUSH BC ;yes, save write flag for bios (register C). - CALL LOGICAL ;convert (BLKNMBR) over to loical sectors. - LD A,(MODE) ;get access mode flag (1=sequential, - DEC A ;0=random, 2=special?). - DEC A - JP NZ,WTSEQ9 -; -; Special random i/o from function #40. Maybe for M/PM, but the -; current block, if it has not been written to, will be zeroed -; out and then written (reason?). -; - POP BC - PUSH BC - LD A,C ;get write status flag (2=writing unused space). - DEC A - DEC A - JP NZ,WTSEQ9 - PUSH HL - LD HL,(DIRBUF) ;zero out the directory buffer. - LD D,A ;note that (A) is zero here. -WTSEQ7: LD (HL),A - INC HL - INC D ;do 128 bytes. - JP P,WTSEQ7 - CALL DIRDMA ;tell the bios the dma address for directory access. - LD HL,(LOGSECT) ;get sector that starts current block. - LD C,2 ;set 'writing to unused space' flag. -WTSEQ8: LD (BLKNMBR),HL ;save sector to write. - PUSH BC - CALL TRKSEC1 ;determine its track and sector numbers. - POP BC - CALL DOWRITE ;now write out 128 bytes of zeros. - LD HL,(BLKNMBR) ;get sector number. - LD C,0 ;set normal write flag. - LD A,(BLKMASK) ;determine if we have written the entire - LD B,A ;physical block. - AND L - CP B - INC HL ;prepare for the next one. - JP NZ,WTSEQ8 ;continue until (BLKMASK+1) sectors written. - POP HL ;reset next sector number. - LD (BLKNMBR),HL - CALL DEFDMA ;and reset dma address. -; -; Normal disk write. Set the desired track and sector then -; do the actual write. -; -WTSEQ9: CALL TRKSEC1 ;determine track and sector for this write. - POP BC ;get write status flag. - PUSH BC - CALL DOWRITE ;and write this out. - POP BC - LD A,(SAVNREC) ;get number of records in file. - LD HL,SAVNXT ;get last record written. - CP (HL) - JP C,WTSEQ10 - LD (HL),A ;we have to update record count. - INC (HL) - LD C,2 -; -;* This area has been patched to correct disk update problem -;* when using blocking and de-blocking in the BIOS. -; -WTSEQ10:NOP ;was 'dcr c' - NOP ;was 'dcr c' - LD HL,0 ;was 'jnz wtseq99' -; -; * End of patch. -; - PUSH AF - CALL GETS2 ;set 'extent written to' flag. - AND 7FH ;(* clear bit 7 *) - LD (HL),A - POP AF ;get record count for this extent. -WTSEQ99:CP 127 ;is it full? - JP NZ,WTSEQ12 - LD A,(MODE) ;yes, are we in sequential mode? - CP 1 - JP NZ,WTSEQ12 - CALL SETNREC ;yes, set next record number. - CALL GETNEXT ;and get next empty space in directory. - LD HL,STATUS ;ok? - LD A,(HL) - OR A - JP NZ,WTSEQ11 - DEC A ;yes, set record count to -1. - LD (SAVNREC),A -WTSEQ11:LD (HL),0 ;clear status. -WTSEQ12:JP SETNREC ;set next record to access. -; -; For random i/o, set the fcb for the desired record number -; based on the 'r0,r1,r2' bytes. These bytes in the fcb are -; used as follows: -; -; fcb+35 fcb+34 fcb+33 -; | 'r-2' | 'r-1' | 'r-0' | -; |7 0 | 7 0 | 7 0| -; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0| -; | overflow | | extra | extent | record # | -; | ______________| |_extent|__number___|_____________| -; also 's2' -; -; On entry, register (C) contains 0ffh if this is a read -; and thus we can not access unwritten disk space. Otherwise, -; another extent will be opened (for writing) if required. -; -POSITION: XOR A ;set random i/o flag. - LD (MODE),A -; -; Special entry (function #40). M/PM ? -; -POSITN1:PUSH BC ;save read/write flag. - LD HL,(PARAMS) ;get address of fcb. - EX DE,HL - LD HL,33 ;now get byte 'r0'. - ADD HL,DE - LD A,(HL) - AND 7FH ;keep bits 0-6 for the record number to access. - PUSH AF - LD A,(HL) ;now get bit 7 of 'r0' and bits 0-3 of 'r1'. - RLA - INC HL - LD A,(HL) - RLA - AND 1FH ;and save this in bits 0-4 of (C). - LD C,A ;this is the extent byte. - LD A,(HL) ;now get the extra extent byte. - RRA - RRA - RRA - RRA - AND 0FH - LD B,A ;and save it in (B). - POP AF ;get record number back to (A). - INC HL ;check overflow byte 'r2'. - LD L,(HL) - INC L - DEC L - LD L,6 ;prepare for error. - JP NZ,POSITN5 ;out of disk space error. - LD HL,32 ;store record number into fcb. - ADD HL,DE - LD (HL),A - LD HL,12 ;and now check the extent byte. - ADD HL,DE - LD A,C - SUB (HL) ;same extent as before? - JP NZ,POSITN2 - LD HL,14 ;yes, check extra extent byte 's2' also. - ADD HL,DE - LD A,B - SUB (HL) - AND 7FH - JP Z,POSITN3 ;same, we are almost done then. -; -; Get here when another extent is required. -; -POSITN2:PUSH BC - PUSH DE - CALL CLOSEIT ;close current extent. - POP DE - POP BC - LD L,3 ;prepare for error. - LD A,(STATUS) - INC A - JP Z,POSITN4 ;close error. - LD HL,12 ;put desired extent into fcb now. - ADD HL,DE - LD (HL),C - LD HL,14 ;and store extra extent byte 's2'. - ADD HL,DE - LD (HL),B - CALL OPENIT ;try and get this extent. - LD A,(STATUS) ;was it there? - INC A - JP NZ,POSITN3 - POP BC ;no. can we create a new one (writing?). - PUSH BC - LD L,4 ;prepare for error. - INC C - JP Z,POSITN4 ;nope, reading unwritten space error. - CALL GETEMPTY ;yes we can, try to find space. - LD L,5 ;prepare for error. - LD A,(STATUS) - INC A - JP Z,POSITN4 ;out of space? -; -; Normal return location. Clear error code and return. -; -POSITN3:POP BC ;restore stack. - XOR A ;and clear error code byte. - JP SETSTAT -; -; Error. Set the 's2' byte to indicate this (why?). -; -POSITN4:PUSH HL - CALL GETS2 - LD (HL),0C0H - POP HL -; -; Return with error code (presently in L). -; -POSITN5:POP BC - LD A,L ;get error code. - LD (STATUS),A - JP SETS2B7 -; -; Read a random record. -; -READRAN:LD C,0FFH ;set 'read' status. - CALL POSITION ;position the file to proper record. - CALL Z,RDSEQ1 ;and read it as usual (if no errors). - RET -; -; Write to a random record. -; -WRITERAN: LD C,0 ;set 'writing' flag. - CALL POSITION ;position the file to proper record. - CALL Z,WTSEQ1 ;and write as usual (if no errors). - RET -; -; Compute the random record number. Enter with (HL) pointing -; to a fcb an (DE) contains a relative location of a record -; number. On exit, (C) contains the 'r0' byte, (B) the 'r1' -; byte, and (A) the 'r2' byte. -; -; On return, the zero flag is set if the record is within -; bounds. Otherwise, an overflow occured. -; -COMPRAND: EX DE,HL ;save fcb pointer in (DE). - ADD HL,DE ;compute relative position of record #. - LD C,(HL) ;get record number into (BC). - LD B,0 - LD HL,12 ;now get extent. - ADD HL,DE - LD A,(HL) ;compute (BC)=(record #)+(extent)*128. - RRCA ;move lower bit into bit 7. - AND 80H ;and ignore all other bits. - ADD A,C ;add to our record number. - LD C,A - LD A,0 ;take care of any carry. - ADC A,B - LD B,A - LD A,(HL) ;now get the upper bits of extent into - RRCA ;bit positions 0-3. - AND 0FH ;and ignore all others. - ADD A,B ;add this in to 'r1' byte. - LD B,A - LD HL,14 ;get the 's2' byte (extra extent). - ADD HL,DE - LD A,(HL) - ADD A,A ;and shift it left 4 bits (bits 4-7). - ADD A,A - ADD A,A - ADD A,A - PUSH AF ;save carry flag (bit 0 of flag byte). - ADD A,B ;now add extra extent into 'r1'. - LD B,A - PUSH AF ;and save carry (overflow byte 'r2'). - POP HL ;bit 0 of (L) is the overflow indicator. - LD A,L - POP HL ;and same for first carry flag. - OR L ;either one of these set? - AND 01H ;only check the carry flags. - RET -; -; Routine to setup the fcb (bytes 'r0', 'r1', 'r2') to -; reflect the last record used for a random (or other) file. -; This reads the directory and looks at all extents computing -; the largerst record number for each and keeping the maximum -; value only. Then 'r0', 'r1', and 'r2' will reflect this -; maximum record number. This is used to compute the space used -; by a random file. -; -RANSIZE:LD C,12 ;look thru directory for first entry with - CALL FINDFST ;this name. - LD HL,(PARAMS) ;zero out the 'r0, r1, r2' bytes. - LD DE,33 - ADD HL,DE - PUSH HL - LD (HL),D ;note that (D)=0. - INC HL - LD (HL),D - INC HL - LD (HL),D -RANSIZ1:CALL CKFILPOS ;is there an extent to process? - JP Z,RANSIZ3 ;no, we are done. - CALL FCB2HL ;set (HL) pointing to proper fcb in dir. - LD DE,15 ;point to last record in extent. - CALL COMPRAND ;and compute random parameters. - POP HL - PUSH HL ;now check these values against those - LD E,A ;already in fcb. - LD A,C ;the carry flag will be set if those - SUB (HL) ;in the fcb represent a larger size than - INC HL ;this extent does. - LD A,B - SBC A,(HL) - INC HL - LD A,E - SBC A,(HL) - JP C,RANSIZ2 - LD (HL),E ;we found a larger (in size) extent. - DEC HL ;stuff these values into fcb. - LD (HL),B - DEC HL - LD (HL),C -RANSIZ2:CALL FINDNXT ;now get the next extent. - JP RANSIZ1 ;continue til all done. -RANSIZ3:POP HL ;we are done, restore the stack and - RET ;return. -; -; Function to return the random record position of a given -; file which has been read in sequential mode up to now. -; -SETRAN: LD HL,(PARAMS) ;point to fcb. - LD DE,32 ;and to last used record. - CALL COMPRAND ;compute random position. - LD HL,33 ;now stuff these values into fcb. - ADD HL,DE - LD (HL),C ;move 'r0'. - INC HL - LD (HL),B ;and 'r1'. - INC HL - LD (HL),A ;and lastly 'r2'. - RET -; -; This routine select the drive specified in (ACTIVE) and -; update the login vector and bitmap table if this drive was -; not already active. -; -LOGINDRV: LD HL,(LOGIN) ;get the login vector. - LD A,(ACTIVE) ;get the default drive. - LD C,A - CALL SHIFTR ;position active bit for this drive - PUSH HL ;into bit 0. - EX DE,HL - CALL SELECT ;select this drive. - POP HL - CALL Z,SLCTERR ;valid drive? - LD A,L ;is this a newly activated drive? - RRA - RET C - LD HL,(LOGIN) ;yes, update the login vector. - LD C,L - LD B,H - CALL SETBIT - LD (LOGIN),HL ;and save. - JP BITMAP ;now update the bitmap. -; -; Function to set the active disk number. -; -SETDSK: LD A,(EPARAM) ;get parameter passed and see if this - LD HL,ACTIVE ;represents a change in drives. - CP (HL) - RET Z - LD (HL),A ;yes it does, log it in. - JP LOGINDRV -; -; This is the 'auto disk select' routine. The firsst byte -; of the fcb is examined for a drive specification. If non -; zero then the drive will be selected and loged in. -; -AUTOSEL:LD A,0FFH ;say 'auto-select activated'. - LD (AUTO),A - LD HL,(PARAMS) ;get drive specified. - LD A,(HL) - AND 1FH ;look at lower 5 bits. - DEC A ;adjust for (1=A, 2=B) etc. - LD (EPARAM),A ;and save for the select routine. - CP 1EH ;check for 'no change' condition. - JP NC,AUTOSL1 ;yes, don't change. - LD A,(ACTIVE) ;we must change, save currently active - LD (OLDDRV),A ;drive. - LD A,(HL) ;and save first byte of fcb also. - LD (AUTOFLAG),A ;this must be non-zero. - AND 0E0H ;whats this for (bits 6,7 are used for - LD (HL),A ;something)? - CALL SETDSK ;select and log in this drive. -AUTOSL1:LD A,(USERNO) ;move user number into fcb. - LD HL,(PARAMS) ;(* upper half of first byte *) - OR (HL) - LD (HL),A - RET ;and return (all done). -; -; Function to return the current cp/m version number. -; -GETVER: LD A,022H ;version 2.2 - JP SETSTAT -; -; Function to reset the disk system. -; -RSTDSK: LD HL,0 ;clear write protect status and log - LD (WRTPRT),HL ;in vector. - LD (LOGIN),HL - XOR A ;select drive 'A'. - LD (ACTIVE),A - LD HL,TBUFF ;setup default dma address. - LD (USERDMA),HL - CALL DEFDMA - JP LOGINDRV ;now log in drive 'A'. -; -; Function to open a specified file. -; -OPENFIL:CALL CLEARS2 ;clear 's2' byte. - CALL AUTOSEL ;select proper disk. - JP OPENIT ;and open the file. -; -; Function to close a specified file. -; -CLOSEFIL: CALL AUTOSEL ;select proper disk. - JP CLOSEIT ;and close the file. -; -; Function to return the first occurence of a specified file -; name. If the first byte of the fcb is '?' then the name will -; not be checked (get the first entry no matter what). -; -GETFST: LD C,0 ;prepare for special search. - EX DE,HL - LD A,(HL) ;is first byte a '?'? - CP '?' - JP Z,GETFST1 ;yes, just get very first entry (zero length match). - CALL SETEXT ;get the extension byte from fcb. - LD A,(HL) ;is it '?'? if yes, then we want - CP '?' ;an entry with a specific 's2' byte. - CALL NZ,CLEARS2 ;otherwise, look for a zero 's2' byte. - CALL AUTOSEL ;select proper drive. - LD C,15 ;compare bytes 0-14 in fcb (12&13 excluded). -GETFST1:CALL FINDFST ;find an entry and then move it into - JP MOVEDIR ;the users dma space. -; -; Function to return the next occurence of a file name. -; -GETNXT: LD HL,(SAVEFCB) ;restore pointers. note that no - LD (PARAMS),HL ;other dbos calls are allowed. - CALL AUTOSEL ;no error will be returned, but the - CALL FINDNXT ;results will be wrong. - JP MOVEDIR -; -; Function to delete a file by name. -; -DELFILE:CALL AUTOSEL ;select proper drive. - CALL ERAFILE ;erase the file. - JP STSTATUS ;set status and return. -; -; Function to execute a sequential read of the specified -; record number. -; -READSEQ:CALL AUTOSEL ;select proper drive then read. - JP RDSEQ -; -; Function to write the net sequential record. -; -WRTSEQ: CALL AUTOSEL ;select proper drive then write. - JP WTSEQ -; -; Create a file function. -; -FCREATE:CALL CLEARS2 ;clear the 's2' byte on all creates. - CALL AUTOSEL ;select proper drive and get the next - JP GETEMPTY ;empty directory space. -; -; Function to rename a file. -; -RENFILE:CALL AUTOSEL ;select proper drive and then switch - CALL CHGNAMES ;file names. - JP STSTATUS -; -; Function to return the login vector. -; -GETLOG: LD HL,(LOGIN) - JP GETPRM1 -; -; Function to return the current disk assignment. -; -GETCRNT:LD A,(ACTIVE) - JP SETSTAT -; -; Function to set the dma address. -; -PUTDMA: EX DE,HL - LD (USERDMA),HL ;save in our space and then get to - JP DEFDMA ;the bios with this also. -; -; Function to return the allocation vector. -; -GETALOC:LD HL,(ALOCVECT) - JP GETPRM1 -; -; Function to return the read-only status vector. -; -GETROV: LD HL,(WRTPRT) - JP GETPRM1 -; -; Function to set the file attributes (read-only, system). -; -SETATTR:CALL AUTOSEL ;select proper drive then save attributes. - CALL SAVEATTR - JP STSTATUS -; -; Function to return the address of the disk parameter block -; for the current drive. -; -GETPARM:LD HL,(DISKPB) -GETPRM1:LD (STATUS),HL - RET -; -; Function to get or set the user number. If (E) was (FF) -; then this is a request to return the current user number. -; Else set the user number from (E). -; -GETUSER:LD A,(EPARAM) ;get parameter. - CP 0FFH ;get user number? - JP NZ,SETUSER - LD A,(USERNO) ;yes, just do it. - JP SETSTAT -SETUSER:AND 1FH ;no, we should set it instead. keep low - LD (USERNO),A ;bits (0-4) only. - RET -; -; Function to read a random record from a file. -; -RDRANDOM: CALL AUTOSEL ;select proper drive and read. - JP READRAN -; -; Function to compute the file size for random files. -; -WTRANDOM: CALL AUTOSEL ;select proper drive and write. - JP WRITERAN -; -; Function to compute the size of a random file. -; -FILESIZE: CALL AUTOSEL ;select proper drive and check file length - JP RANSIZE -; -; Function #37. This allows a program to log off any drives. -; On entry, set (DE) to contain a word with bits set for those -; drives that are to be logged off. The log-in vector and the -; write protect vector will be updated. This must be a M/PM -; special function. -; -LOGOFF: LD HL,(PARAMS) ;get drives to log off. - LD A,L ;for each bit that is set, we want - CPL ;to clear that bit in (LOGIN) - LD E,A ;and (WRTPRT). - LD A,H - CPL - LD HL,(LOGIN) ;reset the login vector. - AND H - LD D,A - LD A,L - AND E - LD E,A - LD HL,(WRTPRT) - EX DE,HL - LD (LOGIN),HL ;and save. - LD A,L ;now do the write protect vector. - AND E - LD L,A - LD A,H - AND D - LD H,A - LD (WRTPRT),HL ;and save. all done. - RET -; -; Get here to return to the user. -; -GOBACK: LD A,(AUTO) ;was auto select activated? - OR A - JP Z,GOBACK1 - LD HL,(PARAMS) ;yes, but was a change made? - LD (HL),0 ;(* reset first byte of fcb *) - LD A,(AUTOFLAG) - OR A - JP Z,GOBACK1 - LD (HL),A ;yes, reset first byte properly. - LD A,(OLDDRV) ;and get the old drive and select it. - LD (EPARAM),A - CALL SETDSK -GOBACK1:LD HL,(USRSTACK) ;reset the users stack pointer. - LD SP,HL - LD HL,(STATUS) ;get return status. - LD A,L ;force version 1.4 compatability. - LD B,H - RET ;and go back to user. -; -; Function #40. This is a special entry to do random i/o. -; For the case where we are writing to unused disk space, this -; space will be zeroed out first. This must be a M/PM special -; purpose function, because why would any normal program even -; care about the previous contents of a sector about to be -; written over. -; -WTSPECL:CALL AUTOSEL ;select proper drive. - LD A,2 ;use special write mode. - LD (MODE),A - LD C,0 ;set write indicator. - CALL POSITN1 ;position the file. - CALL Z,WTSEQ1 ;and write (if no errors). - RET -; -;************************************************************** -;* -;* BDOS data storage pool. -;* -;************************************************************** -; -EMPTYFCB: DEFB 0E5H ;empty directory segment indicator. -WRTPRT: DEFW 0 ;write protect status for all 16 drives. -LOGIN: DEFW 0 ;drive active word (1 bit per drive). -USERDMA:DEFW 080H ;user's dma address (defaults to 80h). -; -; Scratch areas from parameter block. -; -SCRATCH1: DEFW 0 ;relative position within dir segment for file (0-3). -SCRATCH2: DEFW 0 ;last selected track number. -SCRATCH3: DEFW 0 ;last selected sector number. -; -; Disk storage areas from parameter block. -; -DIRBUF: DEFW 0 ;address of directory buffer to use. -DISKPB: DEFW 0 ;contains address of disk parameter block. -CHKVECT:DEFW 0 ;address of check vector. -ALOCVECT: DEFW 0 ;address of allocation vector (bit map). -; -; Parameter block returned from the bios. -; -SECTORS:DEFW 0 ;sectors per track from bios. -BLKSHFT:DEFB 0 ;block shift. -BLKMASK:DEFB 0 ;block mask. -EXTMASK:DEFB 0 ;extent mask. -DSKSIZE:DEFW 0 ;disk size from bios (number of blocks-1). -DIRSIZE:DEFW 0 ;directory size. -ALLOC0: DEFW 0 ;storage for first bytes of bit map (dir space used). -ALLOC1: DEFW 0 -OFFSET: DEFW 0 ;first usable track number. -XLATE: DEFW 0 ;sector translation table address. -; -; -CLOSEFLG: DEFB 0 ;close flag (=0ffh is extent written ok). -RDWRTFLG: DEFB 0 ;read/write flag (0ffh=read, 0=write). -FNDSTAT:DEFB 0 ;filename found status (0=found first entry). -MODE: DEFB 0 ;I/o mode select (0=random, 1=sequential, 2=special random). -EPARAM: DEFB 0 ;storage for register (E) on entry to bdos. -RELBLOCK: DEFB 0 ;relative position within fcb of block number written. -COUNTER:DEFB 0 ;byte counter for directory name searches. -SAVEFCB:DEFW 0,0 ;save space for address of fcb (for directory searches). -BIGDISK:DEFB 0 ;if =0 then disk is > 256 blocks long. -AUTO: DEFB 0 ;if non-zero, then auto select activated. -OLDDRV: DEFB 0 ;on auto select, storage for previous drive. -AUTOFLAG: DEFB 0 ;if non-zero, then auto select changed drives. -SAVNXT: DEFB 0 ;storage for next record number to access. -SAVEXT: DEFB 0 ;storage for extent number of file. -SAVNREC:DEFW 0 ;storage for number of records in file. -BLKNMBR:DEFW 0 ;block number (physical sector) used within a file or logical sect -LOGSECT:DEFW 0 ;starting logical (128 byte) sector of block (physical sector). -FCBPOS: DEFB 0 ;relative position within buffer for fcb of file of interest. -FILEPOS:DEFW 0 ;files position within directory (0 to max entries -1). -; -; Disk directory buffer checksum bytes. One for each of the -; 16 possible drives. -; -CKSUMTBL: DEFB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -; -; Extra space ? -; - DEFB 0,0,0,0 -; -;************************************************************** -;* -;* B I O S J U M P T A B L E -;* -;************************************************************** -; -BOOT: JP 0 ;NOTE WE USE FAKE DESTINATIONS -WBOOT: JP 0 -CONST: JP 0 -CONIN: JP 0 -CONOUT: JP 0 -LIST: JP 0 -PUNCH: JP 0 -READER: JP 0 -HOME: JP 0 -SELDSK: JP 0 -SETTRK: JP 0 -SETSEC: JP 0 -SETDMA: JP 0 -READ: JP 0 -WRITE: JP 0 -PRSTAT: JP 0 -SECTRN: JP 0 -; -;* -;****************** E N D O F C P / M ***************** -;* - END - diff --git a/branches/dgg/Applegate/cpm22.inc b/branches/dgg/Applegate/cpm22.inc deleted file mode 100644 index 60405ae8..00000000 --- a/branches/dgg/Applegate/cpm22.inc +++ /dev/null @@ -1,39 +0,0 @@ -;******************************************************** -; This file contains bits of information that are common -; between the CCP, BDOS and BIOS. Since the CCP and -; BDOS are built as one unit and the BIOS as another, it -; is handy to have common things in a common file rather -; that constantly needing to keep things in sync between -; two different files. -; -; 02/16/2013 - Bob Applegate - - -; -; This is the TOTAL RAM in the system. Ie, starts at 64 -; but then gets decreased due to ROM monitors at top of -; memory. This can be set artificially low to allow -; more room for BIOS debugging code. -; -; This is the amount of contiguous RAM from 0000. -; -RAMSIZE EQU 48 ;expressed in K - -; -; Low memory locations -; -IOBYTE EQU 3 ;i/o definition byte. -TDRIVE EQU 4 ;current drive name and user number. -ENTRY EQU 5 ;entry point for the cp/m bdos. - - - -CCPSIZE EQU 0800H ;I hate hard-coding things! -BDOSSIZE EQU 0E00H - -; -; Where CP/M things are located -; -CCPBASE equ (RAMSIZE-7)*1024 -BDOSBASE equ (CCPBASE+CCPSIZE) -BIOSBASE equ (BDOSBASE+BDOSSIZE) diff --git a/branches/dgg/Applegate/loadcpm.py b/branches/dgg/Applegate/loadcpm.py deleted file mode 100755 index 2fc1b81b..00000000 --- a/branches/dgg/Applegate/loadcpm.py +++ /dev/null @@ -1,69 +0,0 @@ -#!/usr/bin/python -# Written by Douglas Goodall 17:25 Wed, Jan 30, 2013 -# load cpm.bin and bios.bin then jump - -import sys -import os -import serial - -# passing in a string either "12" or "0x12" -# return value is string of hex digits only (no 0x) -def safebyte(parm): - xyz = parm - myord = ord(xyz) - hexdata = hex(myord) - newstr = hexdata - if (hexdata[0] == '0'): - if(hexdata[1] == 'x'): - newstr = hexdata[2] - if(len(hexdata)>3): - newstr = newstr + hexdata[3] - return newstr - -# passing in a string either "1234" of "0x1234" -# return value is string of hex digits only (1234) (no 0x) -def safeword(parm): - xyz = parm - myint = int(xyz) - hexdata = hex(myint) - newstr = hexdata - if (hexdata[0] == '0'): - if(hexdata[1] == 'x'): - newstr = hexdata[2] - if(len(hexdata)>3): - newstr = newstr + hexdata[3] - if(len(hexdata)>4): - newstr = newstr + hexdata[4] - if(len(hexdata)>5): - newstr = newstr + hexdata[5] - return newstr - -def loadngo(filename): - statinfo = os.stat(filename) - filelen = statinfo.st_size - infile = open(filename,'rb') - filedata = infile.read() - infile.close() - ser = serial.Serial('/dev/cu.PL2303-0000201D', 19200, timeout=10) - ser.write("\n\n") - ser.write("sa400\n") - print ser.read(12); - for x in range(1,filelen): - ser.write(safebyte(filedata[x-1])) - ser.write(" ") - print ser.read(12) - ser.write("\n") - print ser.read(12) - ser.close() - -print "*******************************************************************" -print "loadcpm.py 1/30/2013 dwg - load&go S-100 CP/M using master-yoda ROM" -print "*******************************************************************" -#loadngo("cpm.bin") -ser = serial.Serial('/dev/cu.PL2303-0000201D', 19200, timeout=1) -ser.read(128) -ser.read(128) -ser.write("\n") -ser.close() -loadngo("cpm.bin") - diff --git a/branches/dgg/Applegate/s100iobd.inc b/branches/dgg/Applegate/s100iobd.inc deleted file mode 100644 index 553ee3cb..00000000 --- a/branches/dgg/Applegate/s100iobd.inc +++ /dev/null @@ -1,77 +0,0 @@ - .page -;******************************************************** -; These are I/O functions for the CCS 2710 four-port -; serial I/O board. -; -; Bob Applegate, 02/16/2008 -; -SIObase .equ 0E0H -; -SIODATA .equ SIObase -SIOBAUDL .equ SIObase ;also used for baud rate -SIOINTEN .equ SIObase+1 -SIOBAUDH .equ SIObase+1 ;ditto -SIOIDENT .equ SIObase+2 -SIOLCTRL .equ SIObase+3 -SIOMDMCT .equ SIObase+4 -SIOLSTAT .equ SIObase+5 -SIOMDMST .equ SIObase+6 -BAUD03 .equ 0180H ;divisor for 300 baud -BAUD12 .equ 060H ;1200 baud -BAUD_2400 .equ 030h ;2400 baud -BAUD96 .equ 00CH ;9600 baud -DATRDY .equ 01H ;rec'd data ready -TXMTY .equ 20H ;transmitter holding reg empty -HSMSK .equ 20H - -BAUD_RATE .equ BAUD_2400 - -; -; This function initializes the main console port for the -; default baud rate. -; -initser: ld a,0fH - out (SIOMDMCT),a - ld a,083H ;enable divisor latch access - out (SIOLCTRL),a - ld a,BAUD_RATE / 256 ;get hi byte - out (SIOBAUDH),a - ld a,BAUD_RATE % 256 ;get low byte - out (SIOBAUDL),a - ld a,03H ;8 data bits, one stop bit, no parity - out (SIOLCTRL),a - xor a ;clear acc - out (SIOINTEN),a ;disable ints - out (SIOLSTAT),a ;clear status - in a,(SIODATA) ;clear out any garbage in rec'd data reg - ret -; -; TTY output of character in C. Modifies A. -; -ttyout: IN A,(SIOLSTAT) ;was A,TTS, read status port - AND TXMTY ;check buffer empty bit - JR Z,ttyout ;branch if not empty - LD A,C - OUT (SIODATA),A ;was TTO,A, send out character - RET ;thassit -; -; Check to see if a character is ready to be read from the TTY. -; Returns TRUE (0ffh) in A is there is a character waiting, or -; FALSE (0) if there is nothing. -; -ttystat: IN A,(SIOLSTAT) ;was A,TTS - AND DATRDY - LD A,TRUE ;was FALSE - RET NZ - CPL - RET -; -; This gets the next character from the TTY and returns it in A. -; This will block if there is nothing waiting. -; -ttyin: IN A,(SIOLSTAT) ;read status reg - AND DATRDY ;look for data ready - JR Z,ttyin ;wait for char - IN a,(SIODATA) ;read character - RET - .page diff --git a/branches/dgg/Applegate/tasm.inc b/branches/dgg/Applegate/tasm.inc deleted file mode 100644 index e61cd62d..00000000 --- a/branches/dgg/Applegate/tasm.inc +++ /dev/null @@ -1,19 +0,0 @@ -; -; To make it easier to port code from other assemblers, -; this maps some common psuedo-ops into TASM versions. -; -#define EQU .equ -#define equ .equ -#define END .end -#define end .end -#define DEFB .db -#define DB .db -#define db .db -#define DEFW .dw -#define DW .dw -#define dw .dw -#define DS .ds -#define ds .ds -#define ORG .org -#define org .org -#define TEXT .text diff --git a/branches/dgg/Applegate/tasm.tab b/branches/dgg/Applegate/tasm.tab deleted file mode 100644 index f644ccd4..00000000 --- a/branches/dgg/Applegate/tasm.tab +++ /dev/null @@ -1,594 +0,0 @@ -"TASM Z80 Assembler. " -/**************************************************************************** -/* $Id: tasm80.tab 1.2 1998/02/28 14:31:22 toma Exp $ -/**************************************************************************** -/* This is the instruction set definition table -/* for the Z80 version of TASM. -/* Thomas N. Anderson, Speech Technology Incorporated -/* This table authored and submitted by Carl A. Wall, VE3APY. -/* -/* Class bits assigned as follows: -/* Bit-0 = Z80 (base instruction set) -/* Bit-1 = HD64180 (extended instructions) -/* See TASM manual for info on table structure. -/* -/*INSTR ARGS OP BYTES RULE CLASS SHIFT OR */ -/*-------------------------------------------*/ - -ADC A,(HL) 8E 1 NOP 1 -ADC A,(IX*) 8EDD 3 ZIX 1 -ADC A,(IY*) 8EFD 3 ZIX 1 -ADC A,A 8F 1 NOP 1 -ADC A,B 88 1 NOP 1 -ADC A,C 89 1 NOP 1 -ADC A,D 8A 1 NOP 1 -ADC A,E 8B 1 NOP 1 -ADC A,H 8C 1 NOP 1 -ADC A,L 8D 1 NOP 1 -ADC A,* CE 2 NOP 1 -ADC HL,BC 4AED 2 NOP 1 -ADC HL,DE 5AED 2 NOP 1 -ADC HL,HL 6AED 2 NOP 1 -ADC HL,SP 7AED 2 NOP 1 - -ADD A,(HL) 86 1 NOP 1 -ADD A,(IX*) 86DD 3 ZIX 1 -ADD A,(IY*) 86FD 3 ZIX 1 -ADD A,A 87 1 NOP 1 -ADD A,B 80 1 NOP 1 -ADD A,C 81 1 NOP 1 -ADD A,D 82 1 NOP 1 -ADD A,E 83 1 NOP 1 -ADD A,H 84 1 NOP 1 -ADD A,L 85 1 NOP 1 -ADD A,* C6 2 NOP 1 -ADD HL,BC 09 1 NOP 1 -ADD HL,DE 19 1 NOP 1 -ADD HL,HL 29 1 NOP 1 -ADD HL,SP 39 1 NOP 1 -ADD IX,BC 09DD 2 NOP 1 -ADD IX,DE 19DD 2 NOP 1 -ADD IX,IX 29DD 2 NOP 1 -ADD IX,SP 39DD 2 NOP 1 -ADD IY,BC 09FD 2 NOP 1 -ADD IY,DE 19FD 2 NOP 1 -ADD IY,IY 29FD 2 NOP 1 -ADD IY,SP 39FD 2 NOP 1 - -AND (HL) A6 1 NOP 1 -AND (IX*) A6DD 3 ZIX 1 -AND (IY*) A6FD 3 ZIX 1 -AND A A7 1 NOP 1 -AND B A0 1 NOP 1 -AND C A1 1 NOP 1 -AND D A2 1 NOP 1 -AND E A3 1 NOP 1 -AND H A4 1 NOP 1 -AND L A5 1 NOP 1 -AND * E6 2 NOP 1 - -BIT *,(HL) 46CB 2 ZBIT 1 -BIT *,(IX*) CBDD 4 ZBIT 1 0 4600 -BIT *,(IY*) CBFD 4 ZBIT 1 0 4600 -BIT *,A 47CB 2 ZBIT 1 -BIT *,B 40CB 2 ZBIT 1 -BIT *,C 41CB 2 ZBIT 1 -BIT *,D 42CB 2 ZBIT 1 -BIT *,E 43CB 2 ZBIT 1 -BIT *,H 44CB 2 ZBIT 1 -BIT *,L 45CB 2 ZBIT 1 - -CALL C,* DC 3 NOP 1 -CALL M,* FC 3 NOP 1 -CALL NC,* D4 3 NOP 1 -CALL NZ,* C4 3 NOP 1 -CALL P,* F4 3 NOP 1 -CALL PE,* EC 3 NOP 1 -CALL PO,* E4 3 NOP 1 -CALL Z,* CC 3 NOP 1 -CALL * CD 3 NOP 1 - -CCF "" 3F 1 NOP 1 - -CP (HL) BE 1 NOP 1 -CP (IX*) BEDD 3 ZIX 1 -CP (IY*) BEFD 3 ZIX 1 -CP A BF 1 NOP 1 -CP B B8 1 NOP 1 -CP C B9 1 NOP 1 -CP D BA 1 NOP 1 -CP E BB 1 NOP 1 -CP H BC 1 NOP 1 -CP L BD 1 NOP 1 -CP * FE 2 NOP 1 -CPD "" A9ED 2 NOP 1 -CPDR "" B9ED 2 NOP 1 -CPIR "" B1ED 2 NOP 1 -CPI "" A1ED 2 NOP 1 -CPL "" 2F 1 NOP 1 - -DAA "" 27 1 NOP 1 - -DEC (HL) 35 1 NOP 1 -DEC (IX*) 35DD 3 ZIX 1 -DEC (IY*) 35FD 3 ZIX 1 -DEC A 3D 1 NOP 1 -DEC B 05 1 NOP 1 -DEC BC 0B 1 NOP 1 -DEC C 0D 1 NOP 1 -DEC D 15 1 NOP 1 -DEC DE 1B 1 NOP 1 -DEC E 1D 1 NOP 1 -DEC H 25 1 NOP 1 -DEC HL 2B 1 NOP 1 -DEC IX 2BDD 2 NOP 1 -DEC IY 2BFD 2 NOP 1 -DEC L 2D 1 NOP 1 -DEC SP 3B 1 NOP 1 -DI "" F3 1 NOP 1 -DJNZ * 10 2 R1 1 - -EI "" FB 1 NOP 1 -EX (SP),HL E3 1 NOP 1 -EX (SP),IX E3DD 2 NOP 1 -EX (SP),IY E3FD 2 NOP 1 -EX AF,AF' 08 1 NOP 1 -EX DE,HL EB 1 NOP 1 -EXX "" D9 1 NOP 1 -HALT "" 76 1 NOP 1 - -IM 0 46ED 2 NOP 1 -IM 1 56ED 2 NOP 1 -IM 2 5EED 2 NOP 1 - -/* Alternate form of above -IM0 46ED 2 NOP 1 -IM1 56ED 2 NOP 1 -IM2 5EED 2 NOP 1 - -IN A,(C) 78ED 2 NOP 1 -IN B,(C) 40ED 2 NOP 1 -IN C,(C) 48ED 2 NOP 1 -IN D,(C) 50ED 2 NOP 1 -IN E,(C) 58ED 2 NOP 1 -IN H,(C) 60ED 2 NOP 1 -IN L,(C) 68ED 2 NOP 1 - -IN A,(*) DB 2 NOP 1 - -IN0 A,(*) 38ED 3 NOP 2 -IN0 B,(*) 00ED 3 NOP 2 -IN0 C,(*) 08ED 3 NOP 2 -IN0 D,(*) 10ED 3 NOP 2 -IN0 E,(*) 18ED 3 NOP 2 -IN0 H,(*) 20ED 3 NOP 2 -IN0 L,(*) 28ED 3 NOP 2 - -INC (HL) 34 1 NOP 1 -INC (IX*) 34DD 3 ZIX 1 -INC (IY*) 34FD 3 ZIX 1 -INC A 3C 1 NOP 1 -INC B 04 1 NOP 1 -INC BC 03 1 NOP 1 -INC C 0C 1 NOP 1 -INC D 14 1 NOP 1 -INC DE 13 1 NOP 1 -INC E 1C 1 NOP 1 -INC H 24 1 NOP 1 -INC HL 23 1 NOP 1 -INC IX 23DD 2 NOP 1 -INC IY 23FD 2 NOP 1 -INC L 2C 1 NOP 1 -INC SP 33 1 NOP 1 - - -IND "" AAED 2 NOP 1 -INDR "" BAED 2 NOP 1 -INI "" A2ED 2 NOP 1 -INIR "" B2ED 2 NOP 1 - -JP (HL) E9 1 NOP 1 -JP (IX) E9DD 2 NOP 1 -JP (IY) E9FD 2 NOP 1 -JP C,* DA 3 NOP 1 -JP M,* FA 3 NOP 1 -JP NC,* D2 3 NOP 1 -JP NZ,* C2 3 NOP 1 -JP P,* F2 3 NOP 1 -JP PE,* EA 3 NOP 1 -JP PO,* E2 3 NOP 1 -JP Z,* CA 3 NOP 1 -JP * C3 3 NOP 1 - -JR C,* 38 2 R1 1 -JR NC,* 30 2 R1 1 -JR NZ,* 20 2 R1 1 -JR Z,* 28 2 R1 1 -JR * 18 2 R1 1 - -LD (BC),A 02 1 NOP 1 -LD (DE),A 12 1 NOP 1 -LD (HL),A 77 1 NOP 1 -LD (HL),B 70 1 NOP 1 -LD (HL),C 71 1 NOP 1 -LD (HL),D 72 1 NOP 1 -LD (HL),E 73 1 NOP 1 -LD (HL),H 74 1 NOP 1 -LD (HL),L 75 1 NOP 1 -LD (HL),* 36 2 NOP 1 -LD (IX*),A 77DD 3 ZIX 1 -LD (IX*),B 70DD 3 ZIX 1 -LD (IX*),C 71DD 3 ZIX 1 -LD (IX*),D 72DD 3 ZIX 1 -LD (IX*),E 73DD 3 ZIX 1 -LD (IX*),H 74DD 3 ZIX 1 -LD (IX*),L 75DD 3 ZIX 1 -LD (IX*),* 36DD 4 ZIX 1 -LD (IY*),A 77FD 3 ZIX 1 -LD (IY*),B 70FD 3 ZIX 1 -LD (IY*),C 71FD 3 ZIX 1 -LD (IY*),D 72FD 3 ZIX 1 -LD (IY*),E 73FD 3 ZIX 1 -LD (IY*),H 74FD 3 ZIX 1 -LD (IY*),L 75FD 3 ZIX 1 -LD (IY*),* 36FD 4 ZIX 1 -LD (*),A 32 3 NOP 1 -LD (*),BC 43ED 4 NOP 1 -LD (*),DE 53ED 4 NOP 1 -LD (*),HL 22 3 NOP 1 -LD (*),IX 22DD 4 NOP 1 -LD (*),IY 22FD 4 NOP 1 -LD (*),SP 73ED 4 NOP 1 -LD A,(BC) 0A 1 NOP 1 -LD A,(DE) 1A 1 NOP 1 -LD A,(HL) 7E 1 NOP 1 -LD A,(IX*) 7EDD 3 ZIX 1 -LD A,(IY*) 7EFD 3 ZIX 1 -LD A,A 7F 1 NOP 1 -LD A,B 78 1 NOP 1 -LD A,C 79 1 NOP 1 -LD A,D 7A 1 NOP 1 -LD A,E 7B 1 NOP 1 -LD A,H 7C 1 NOP 1 -LD A,I 57ED 2 NOP 1 -LD A,L 7D 1 NOP 1 -LD A,R 5FED 2 NOP 1 -LD A,(*) 3A 3 NOP 1 -LD A,* 3E 2 NOP 1 -LD B,(HL) 46 1 NOP 1 -LD B,(IX*) 46DD 3 ZIX 1 -LD B,(IY*) 46FD 3 ZIX 1 -LD B,A 47 1 NOP 1 -LD B,B 40 1 NOP 1 -LD B,C 41 1 NOP 1 -LD B,D 42 1 NOP 1 -LD B,E 43 1 NOP 1 -LD B,H 44 1 NOP 1 -LD B,L 45 1 NOP 1 -LD B,* 06 2 NOP 1 -LD BC,(*) 4BED 4 NOP 1 -LD BC,* 01 3 NOP 1 -LD C,(HL) 4E 1 NOP 1 -LD C,(IX*) 4EDD 3 ZIX 1 -LD C,(IY*) 4EFD 3 ZIX 1 -LD C,A 4F 1 NOP 1 -LD C,B 48 1 NOP 1 -LD C,C 49 1 NOP 1 -LD C,D 4A 1 NOP 1 -LD C,E 4B 1 NOP 1 -LD C,H 4C 1 NOP 1 -LD C,L 4D 1 NOP 1 -LD C,* 0E 2 NOP 1 -LD D,(HL) 56 1 NOP 1 -LD D,(IX*) 56DD 3 ZIX 1 -LD D,(IY*) 56FD 3 ZIX 1 -LD D,A 57 1 NOP 1 -LD D,B 50 1 NOP 1 -LD D,C 51 1 NOP 1 -LD D,D 52 1 NOP 1 -LD D,E 53 1 NOP 1 -LD D,H 54 1 NOP 1 -LD D,L 55 1 NOP 1 -LD D,* 16 2 NOP 1 -LD DE,(*) 5BED 4 NOP 1 -LD DE,* 11 3 NOP 1 -LD E,(HL) 5E 1 NOP 1 -LD E,(IX*) 5EDD 3 ZIX 1 -LD E,(IY*) 5EFD 3 ZIX 1 -LD E,A 5F 1 NOP 1 -LD E,B 58 1 NOP 1 -LD E,C 59 1 NOP 1 -LD E,D 5A 1 NOP 1 -LD E,E 5B 1 NOP 1 -LD E,H 5C 1 NOP 1 -LD E,L 5D 1 NOP 1 -LD E,* 1E 2 NOP 1 -LD H,(HL) 66 1 NOP 1 -LD H,(IX*) 66DD 3 ZIX 1 -LD H,(IY*) 66FD 3 ZIX 1 -LD H,A 67 1 NOP 1 -LD H,B 60 1 NOP 1 -LD H,C 61 1 NOP 1 -LD H,D 62 1 NOP 1 -LD H,E 63 1 NOP 1 -LD H,H 64 1 NOP 1 -LD H,L 65 1 NOP 1 -LD H,* 26 2 NOP 1 -LD HL,(*) 2A 3 NOP 1 -LD HL,* 21 3 NOP 1 -LD I,A 47ED 2 NOP 1 -LD IX,(*) 2ADD 4 NOP 1 -LD IX,* 21DD 4 NOP 1 -LD IY,(*) 2AFD 4 NOP 1 -LD IY,* 21FD 4 NOP 1 -LD L,(HL) 6E 1 NOP 1 -LD L,(IX*) 6EDD 3 ZIX 1 -LD L,(IY*) 6EFD 3 ZIX 1 -LD L,A 6F 1 NOP 1 -LD L,B 68 1 NOP 1 -LD L,C 69 1 NOP 1 -LD L,D 6A 1 NOP 1 -LD L,E 6B 1 NOP 1 -LD L,H 6C 1 NOP 1 -LD L,L 6D 1 NOP 1 -LD L,* 2E 2 NOP 1 -LD R,A 4FED 2 NOP 1 -LD SP,(*) 7BED 4 NOP 1 -LD SP,HL F9 1 NOP 1 -LD SP,IX F9DD 2 NOP 1 -LD SP,IY F9FD 2 NOP 1 -LD SP,* 31 3 NOP 1 -LDD "" A8ED 2 NOP 1 -LDDR "" B8ED 2 NOP 1 -LDI "" A0ED 2 NOP 1 -LDIR "" B0ED 2 NOP 1 -NEG "" 44ED 2 NOP 1 -NOP "" 00 1 NOP 1 - -MLT BC 4CED 2 NOP 2 -MLT DE 5CED 2 NOP 2 -MLT HL 6CED 2 NOP 2 -MLT SP 7CED 2 NOP 2 - -OR (HL) B6 1 NOP 1 -OR (IX*) B6DD 3 ZIX 1 -OR (IY*) B6FD 3 ZIX 1 -OR A B7 1 NOP 1 -OR B B0 1 NOP 1 -OR C B1 1 NOP 1 -OR D B2 1 NOP 1 -OR E B3 1 NOP 1 -OR H B4 1 NOP 1 -OR L B5 1 NOP 1 -OR * F6 2 NOP 1 - -OTDM "" 8BED 2 NOP 2 -OTDMR "" 9BED 2 NOP 2 -OTDR "" BBED 2 NOP 1 -OTIM "" 83ED 2 NOP 2 -OTIMR "" 93ED 2 NOP 2 -OTIR "" B3ED 2 NOP 1 - -OUT (C),A 79ED 2 NOP 1 -OUT (C),B 41ED 2 NOP 1 -OUT (C),C 49ED 2 NOP 1 -OUT (C),D 51ED 2 NOP 1 -OUT (C),E 59ED 2 NOP 1 -OUT (C),H 61ED 2 NOP 1 -OUT (C),L 69ED 2 NOP 1 -OUT (*),A D3 2 NOP 1 - -OUT0 (*),A 39ED 3 NOP 2 -OUT0 (*),B 01ED 3 NOP 2 -OUT0 (*),C 09ED 3 NOP 2 -OUT0 (*),D 11ED 3 NOP 2 -OUT0 (*),E 19ED 3 NOP 2 -OUT0 (*),H 21ED 3 NOP 2 -OUT0 (*),L 29ED 3 NOP 2 - -OUTD "" ABED 2 NOP 1 -OUTI "" A3ED 2 NOP 1 - -POP AF F1 1 NOP 1 -POP BC C1 1 NOP 1 -POP DE D1 1 NOP 1 -POP HL E1 1 NOP 1 -POP IX E1DD 2 NOP 1 -POP IY E1FD 2 NOP 1 - -PUSH AF F5 1 NOP 1 -PUSH BC C5 1 NOP 1 -PUSH DE D5 1 NOP 1 -PUSH HL E5 1 NOP 1 -PUSH IX E5DD 2 NOP 1 -PUSH IY E5FD 2 NOP 1 - -RES *,(HL) 86CB 2 ZBIT 1 -RES *,(IX*) CBDD 4 ZBIT 1 0 8600 -RES *,(IY*) CBFD 4 ZBIT 1 0 8600 -RES *,A 87CB 2 ZBIT 1 -RES *,B 80CB 2 ZBIT 1 -RES *,C 81CB 2 ZBIT 1 -RES *,D 82CB 2 ZBIT 1 -RES *,E 83CB 2 ZBIT 1 -RES *,H 84CB 2 ZBIT 1 -RES *,L 85CB 2 ZBIT 1 - -RET "" C9 1 NOP 1 -RET C D8 1 NOP 1 -RET M F8 1 NOP 1 -RET NC D0 1 NOP 1 -RET NZ C0 1 NOP 1 -RET P F0 1 NOP 1 -RET PE E8 1 NOP 1 -RET PO E0 1 NOP 1 -RET Z C8 1 NOP 1 -RETI "" 4DED 2 NOP 1 -RETN "" 45ED 2 NOP 1 - -RL (HL) 16CB 2 NOP 1 -RL (IX*) CBDD 4 ZIX 1 0 1600 -RL (IY*) CBFD 4 ZIX 1 0 1600 -RL A 17CB 2 NOP 1 -RL B 10CB 2 NOP 1 -RL C 11CB 2 NOP 1 -RL D 12CB 2 NOP 1 -RL E 13CB 2 NOP 1 -RL H 14CB 2 NOP 1 -RL L 15CB 2 NOP 1 -RLA "" 17 1 NOP 1 - -RLC (HL) 06CB 2 NOP 1 -RLC (IX*) CBDD 4 ZIX 1 0 0600 -RLC (IY*) CBFD 4 ZIX 1 0 0600 -RLC A 07CB 2 NOP 1 -RLC B 00CB 2 NOP 1 -RLC C 01CB 2 NOP 1 -RLC D 02CB 2 NOP 1 -RLC E 03CB 2 NOP 1 -RLC H 04CB 2 NOP 1 -RLC L 05CB 2 NOP 1 -RLCA "" 07 1 NOP 1 -RLD "" 6FED 2 NOP 1 - -RR (HL) 1ECB 2 NOP 1 -RR (IX*) CBDD 4 ZIX 1 0 1E00 -RR (IY*) CBFD 4 ZIX 1 0 1E00 -RR A 1FCB 2 NOP 1 -RR B 18CB 2 NOP 1 -RR C 19CB 2 NOP 1 -RR D 1ACB 2 NOP 1 -RR E 1BCB 2 NOP 1 -RR H 1CCB 2 NOP 1 -RR L 1DCB 2 NOP 1 -RRA "" 1F 1 NOP 1 -RRC (HL) 0ECB 2 NOP 1 -RRC (IX*) CBDD 4 ZIX 1 0 0E00 -RRC (IY*) CBFD 4 ZIX 1 0 0E00 -RRC A 0FCB 2 NOP 1 -RRC B 08CB 2 NOP 1 -RRC C 09CB 2 NOP 1 -RRC D 0ACB 2 NOP 1 -RRC E 0BCB 2 NOP 1 -RRC H 0CCB 2 NOP 1 -RRC L 0DCB 2 NOP 1 -RRCA "" 0F 1 NOP 1 -RRD "" 67ED 2 NOP 1 - -RST 00H C7 1 NOP 1 -RST 08H CF 1 NOP 1 -RST 10H D7 1 NOP 1 -RST 18H DF 1 NOP 1 -RST 20H E7 1 NOP 1 -RST 28H EF 1 NOP 1 -RST 30H F7 1 NOP 1 -RST 38H FF 1 NOP 1 - -/* Alternate form of above -RST 00 C7 1 NOP 1 -RST 08 CF 1 NOP 1 -RST 10 D7 1 NOP 1 -RST 18 DF 1 NOP 1 -RST 20 E7 1 NOP 1 -RST 28 EF 1 NOP 1 -RST 30 F7 1 NOP 1 -RST 38 FF 1 NOP 1 - -SBC A,(HL) 9E 1 NOP 1 -SBC A,(IX*) 9EDD 3 ZIX 1 -SBC A,(IY*) 9EFD 3 ZIX 1 -SBC A,A 9F 1 NOP 1 -SBC A,B 98 1 NOP 1 -SBC A,C 99 1 NOP 1 -SBC A,D 9A 1 NOP 1 -SBC A,E 9B 1 NOP 1 -SBC A,H 9C 1 NOP 1 -SBC A,L 9D 1 NOP 1 -SBC HL,BC 42ED 2 NOP 1 -SBC HL,DE 52ED 2 NOP 1 -SBC HL,HL 62ED 2 NOP 1 -SBC HL,SP 72ED 2 NOP 1 -SBC A,* DE 2 NOP 1 -SCF "" 37 1 NOP 1 - -SET *,(HL) C6CB 2 ZBIT 1 -SET *,(IX*) CBDD 4 ZBIT 1 0 C600 -SET *,(IY*) CBFD 4 ZBIT 1 0 C600 -SET *,A C7CB 2 ZBIT 1 -SET *,B C0CB 2 ZBIT 1 -SET *,C C1CB 2 ZBIT 1 -SET *,D C2CB 2 ZBIT 1 -SET *,E C3CB 2 ZBIT 1 -SET *,H C4CB 2 ZBIT 1 -SET *,L C5CB 2 ZBIT 1 - -SLA (HL) 26CB 2 NOP 1 -SLA (IX*) CBDD 4 ZIX 1 0 2600 -SLA (IY*) CBFD 4 ZIX 1 0 2600 -SLA A 27CB 2 NOP 1 -SLA B 20CB 2 NOP 1 -SLA C 21CB 2 NOP 1 -SLA D 22CB 2 NOP 1 -SLA E 23CB 2 NOP 1 -SLA H 24CB 2 NOP 1 -SLA L 25CB 2 NOP 1 - -SLP "" 76ED 2 NOP 2 - -SRA (HL) 2ECB 2 NOP 1 -SRA (IX*) CBDD 4 ZIX 1 0 2E00 -SRA (IY*) CBFD 4 ZIX 1 0 2E00 -SRA A 2FCB 2 NOP 1 -SRA B 28CB 2 NOP 1 -SRA C 29CB 2 NOP 1 -SRA D 2ACB 2 NOP 1 -SRA E 2BCB 2 NOP 1 -SRA H 2CCB 2 NOP 1 -SRA L 2DCB 2 NOP 1 - -SRL (HL) 3ECB 2 NOP 1 -SRL (IX*) CBDD 4 ZIX 1 0 3E00 -SRL (IY*) CBFD 4 ZIX 1 0 3E00 -SRL A 3FCB 2 NOP 1 -SRL B 38CB 2 NOP 1 -SRL C 39CB 2 NOP 1 -SRL D 3ACB 2 NOP 1 -SRL E 3BCB 2 NOP 1 -SRL H 3CCB 2 NOP 1 -SRL L 3DCB 2 NOP 1 - -SUB (HL) 96 1 NOP 1 -SUB (IX*) 96DD 3 ZIX 1 -SUB (IY*) 96FD 3 ZIX 1 -SUB A 97 1 NOP 1 -SUB B 90 1 NOP 1 -SUB C 91 1 NOP 1 -SUB D 92 1 NOP 1 -SUB E 93 1 NOP 1 -SUB H 94 1 NOP 1 -SUB L 95 1 NOP 1 -SUB * D6 2 NOP 1 - -TST A 3CED 2 NOP 2 -TST B 04ED 2 NOP 2 -TST C 0CED 2 NOP 2 -TST D 14ED 2 NOP 2 -TST E 1CED 2 NOP 2 -TST H 24ED 2 NOP 2 -TST L 2CED 2 NOP 2 -TST (HL) 34ED 2 NOP 2 -TST * 64ED 3 NOP 2 - -TSTIO * 74ED 3 NOP 2 - -XOR (HL) AE 1 NOP 1 -XOR (IX*) AEDD 3 ZIX 1 -XOR (IY*) AEFD 3 ZIX 1 -XOR A AF 1 NOP 1 -XOR B A8 1 NOP 1 -XOR C A9 1 NOP 1 -XOR D AA 1 NOP 1 -XOR E AB 1 NOP 1 -XOR H AC 1 NOP 1 -XOR L AD 1 NOP 1 -XOR * EE 2 NOP 1 diff --git a/branches/dgg/Applegate/zapple.asm b/branches/dgg/Applegate/zapple.asm deleted file mode 100644 index 3b522a72..00000000 --- a/branches/dgg/Applegate/zapple.asm +++ /dev/null @@ -1,80 +0,0 @@ -; -;================================================================================================== -; WRAPPER FOR ZAPPLE MONITOR FOR N8VEM PROJECT -; WAYNE WARTHEN - 2012-11-26 -;================================================================================================== -; -; THE FOLLOWING MACROS DO THE HEAVY LIFTING TO MAKE THE ZAPPLE SOURCE -; COMPATIBLE WITH TASM -; -#DEFINE EQU .EQU -#DEFINE NAME \; -#DEFINE PAGE .PAGE -#DEFINE CSEG .CSEG -#DEFINE DSEG .DSEG -#DEFINE ORG .ORG -#DEFINE END .END -#DEFINE IF .IF -#DEFINE ELSE .ELSE -#DEFINE ENDIF .ENDIF -#DEFINE DEFB .DB -#DEFINE DB .DB -#DEFINE DEFW .DW -#DEFINE DW .DW -#DEFINE . _ -#DEFINE TITLE .TITLE -#DEFINE EXT \; -#DEFINE NOT ~ -; -#ADDINSTR IN A,* DB 2 NOP 1 -#ADDINSTR OUT *,A D3 2 NOP 1 -#ADDINSTR ADD A 87 1 NOP 1 -#ADDINSTR ADD D 82 1 NOP 1 -#ADDINSTR ADD * C6 2 NOP 1 -#ADDINSTR ADC A 8F 1 NOP 1 -#ADDINSTR ADC * CE 2 NOP 1 -#ADDINSTR SBC H 9C 1 NOP 1 -; -; -; -COLOC .EQU 0 -LNLOC .EQU 0 -LULOC .EQU 0 -PTPL .EQU 0 -PULOC .EQU 0 -CSLOC .EQU 0 -CILOC .EQU 0 -RPTPL .EQU 0 -RULOC .EQU 0 -; -; 16C550 SERIAL LINE UART -; -SIO_BASE .EQU 90H -SIO_RBR .EQU SIO_BASE + 0 ; DLAB=0: RCVR BUFFER REG (READ ONLY) -SIO_THR .EQU SIO_BASE + 0 ; DLAB=0: XMIT HOLDING REG (WRITE ONLY) -SIO_IER .EQU SIO_BASE + 1 ; DLAB=0: INT ENABLE REG -SIO_IIR .EQU SIO_BASE + 2 ; INT IDENT REGISTER (READ ONLY) -SIO_FCR .EQU SIO_BASE + 2 ; FIFO CONTROL REG (WRITE ONLY) -SIO_LCR .EQU SIO_BASE + 3 ; LINE CONTROL REG -SIO_MCR .EQU SIO_BASE + 4 ; MODEM CONTROL REG -SIO_LSR .EQU SIO_BASE + 5 ; LINE STATUS REG -SIO_MSR .EQU SIO_BASE + 6 ; MODEM STATUS REG -SIO_SCR .EQU SIO_BASE + 7 ; SCRATCH REGISTER -SIO_DLL .EQU SIO_BASE + 0 ; DLAB=1: DIVISOR LATCH (LS) -SIO_DLM .EQU SIO_BASE + 1 ; DLAB=1: DIVISOR LATCH (MS) -; -BAUDRATE .EQU 38400 -UART_DIV .EQU (1843200 / (16 * BAUDRATE)) -; -; -; -BASE .EQU $6000 - -; -; NOW INCLUDE THE MAIN SOURCE -; -#INCLUDE "zapple.z80" -; - .FILL $7000 - $ -; - .END diff --git a/branches/dgg/Applegate/zapple.z80 b/branches/dgg/Applegate/zapple.z80 deleted file mode 100644 index 2505962c..00000000 --- a/branches/dgg/Applegate/zapple.z80 +++ /dev/null @@ -1,1940 +0,0 @@ -; << ZAPPLE 2-K MONITOR SYSTEM >> -; by -; -; TECHNICAL DESIGN LABS, INC. -; RESEARCH PARK -; PRINCETON, NEW JERSEY 08540 -; -; COPYRIGHT JULY 1976 BY TDL INC. -; -; ASSEMBLED BY ROGER AMIDON -; -; -;BASE: EQU 0F000H ; WW: NOW DEFINED IN WRAPPER -USER: EQU BASE+800H -; - TITLE -; -RST7: EQU 38H ;RST 7 (LOCATION FOR TRAP) -;WW IOBYT: EQU 76H ;R/W PORT FOR TEMP. STORAGE -IOBYT: EQU SIO_SCR ; WW - USING UART SPR FOR TEMP. STORAGE -;WW SENSE: EQU 7AH ;PORT FOR INITIAL I/O CMNFIGURATIOL (IN) -;WW SWITCH: EQU 0FFH ;FRONT PANEL SENSE SWITCHES -;WW RCP: EQU 7AH ;READER CONTROL PORT (OUT) -;WW NN: EQU 0F8H ;"I" REGISTER INITIAL VALUE -; -; EXTERNAL EQUATES -; - NAME ZAPPLE - EXT COLOC - EXT LNLOC - EXT LULOC - EXT PTPL - EXT PULOC - EXT CSLOC - EXT CILOC - EXT RPTPL - EXT RULOC -; -; -; -; -;-TELEPRINTER -; -; WW: VALUES BELOW MODIFIED FOR N8VEM STD UART PORTS -TTI: EQU SIO_RBR ;DATA IN PORT -TTO: EQU SIO_THR ;DATA OUT PORT -TTS: EQU SIO_LSR ;STATUS PORT (IN) -TTYDA: EQU $01 ;DATA AVAILABLE MASK BIT -TTYBE: EQU $20 ;XMTR BUFFER EMPTY MASK -; -;-C.R.T. SYSTEM -; -CRTI: EQU 51H ;DATA PORT (IN) -CRTS: EQU 50H ;STATUS PORT (IN) -CRTO: EQU 51H ;DATA PORT (OUT) -CRTDA: EQU 40H ;DATA AVAILABLE MASK -CRTBE: EQU 80H ;XMTR BUFFER EMPTY MASK -; -;-CASSETTE SYSTEM -; -RCSD: EQU 61H ;DATA IN PORT -RCSS: EQU 60H ;STATUS PORT (IN) -RCSDA: EQU 40H ;DATA AVAILABLE MASK -PCASO: EQU 61H ;DATA PORT (OUT) -PCASS: EQU 60H ;CONTROL PORT (OUT) -PCSBE: EQU 80H ;XMTR BUFFER EMPTY MASK -; -; -; -FALSE: EQU 0 ;ISN'T SO -TRUE: EQU NOT FALSE ;IT IS SO -CR: EQU 0DH ;ASCII CARRIAGE RETURN -LF: EQU 0AH ;ASCII LINE FEED -BELL: EQU 7 ;DING -RUB: EQU 0FFH ;RUB OUT -FIL: EQU 00 ;FILL CHARACTER AFTER CRLF -MAX: EQU 7 ;NUMBER OF QUES IN EOF -; -; -; -CMSK: EQU 11111100B ;CONSOLE DEVICE -RMSK: EQU 11110011B ;STORAGE DEVICE (IN) -PMSK: EQU 11001111B ;STORAGE DEVICE (OUT) -LMSK: EQU 00111111B ;LIST DEVICE -; -; -;-CONSOLE CONFIGURATION -CTTY: EQU 0 ;TELEPRINTER -CCRT: EQU 1 ;C.R.T. -BATCH: EQU 2 ;READER FOR INPUT, LIST FOR OUTPUT -CUSE: EQU 3 ;USER DEFINED -; -;-STORAGE INPUT CONFIGURATION -RTTY: EQU 0 ;TELEPRINTER READER -RPTR: EQU 4 ;HIGH-SPEED RDR (EXTERNAL ROUTINE) -RCAS: EQU 8 ;CASSETTE -RUSER: EQU 0CH ;USER DEFINED -; -;-STORAGE OUTPUT CONFIGURATION -PTTY: EQU 0 ;TELEPRINTER PUNCH -PPTP: EQU 10H ;HIGH-SPEED PUNCH (EXTERNAL ROUTINE) -PCAS: EQU 20H ;CASSETTE -PUSER: EQU 30H ;USER DEFINED -; -;-LIST DEVICE CONFIGURATION -LTTY: EQU 0 ;TELEPRINTER PRINTER -LCRT: EQU 40H ;C.R.T. SCREEN -LINE: EQU 80H ;LINE PRINTER (EXTERNAL ROUTINE) -LUSER: EQU 0C0H ;USER DEFINED -; -; -; VECTOR FOR USER DEFINED ROUTINES -; -;.LOC: USER -;CILOC: .BLKB 3 ;CONSOLE INPUT -;COLOC: .BLKB 3 ;CONSOLE OUTPUT -;RPTPL: .BLKB 3 ;HIGH-SPEED READER -;RULOC: .BLKB 3 ;USER DEFINED STORAGE (INPUT) -;PTPL: .BLKB 3 ;HIGH-SPEED PUNCH -;PULOC: .BLKB 3 ;USER DEFINED STORAGE (OUTPUT) -;LNLOC: .BLKB 3 ;LINE PRINTER -;LULOC: .BLKB 3 ;USER DEFINED PRINTER -;CSLOC: .BLKB 3 ;CONSOLE INPUT STATUS ROUTINE -;J: =. -; -; PROGRAM CODE BEGINS HERE -; -; - .ORG BASE ; WW: MODIFIED FOR TASM SYNTAX - JP BEGIN ;GO AROUND VECTORS -; -; -; -; THESE VECTORS MAY BE USED BY USER WRITTEN -; PROGRAMS TO SIMPLIFY THE HANDLING OF I/O -; FROM SYSTEM TO SYSTEM. WHATEVER THE CURRENT -; ASSIGNED DEVICE, THESE VECTORS WILL PERFORM -; THE REQUIRED I/O OPERATION, AND RETURN TO -; THE CALLING PROGRAM. (RET) -; -; THE REGISTER CONVENTION USED FOLLOWS- -; -; ANY INPUT OR OUTPUT DEVICE -; CHARACTER TO BE OUTPUT IN 'C' REGISTER. -; CHARACTER WILL BE IN 'A' REGISTER UPON -; RETURNING FROM AN INPUT OR OUTPUT. -; 'CSTS'- -; RETURN TRUE (0FFH IN 'A' REG.) IF THERE IS -; SOMETHING WAITING, AND ZERO (00) IF NOT. -; 'IOCHK'- -; RETURN WITH THE CURRENT I/O CONFIGURATION -; BYTE IN 'A' REGISTER. -; 'IOSET'- -; ALLOWS A PROGRAM TO DYNAMICALLY ALTER THE -; CURRENT I/O CONFIGURATION, AND REQUIRES -; THE NEW BYTE IN 'C' REGISTER. -; 'MEMCK'- -; RETURNS WITH THE HIGHEST ALLOWED USER -; MEMORY LOCATION. 'B'=HIGH BYTE, 'A'=LOW. -; 'TRAP'- -; THIS IS THE 'BREAKPOINT' ENTRY POINT, -; BUT MAY BE 'CALLED'. IT WILL SAVE -; THE MACHINE STATE. RETURN CAN BE MADE WITH -; A SIMPLE 'G[CR]' ON THE CONSOLE. -; - JP CI ;CONSOLE INPUT - JP RI ;READER INPUT - JP CO ;CONSOLE OUTPUT - JP PUO ;PUNCH OUTPUT - JP LO ;LIST OUTPUT - JP CSTS ;CONSOLE STATUS - JP IOCHK ;I/O CHECK - JP IOSET ;I/O SET - JP MEMCK ;MEMORY LIMIT CHECK -TRAP: JP RESTART ;BREAKPOINT -; -; ANNOUNCEMENT OF MONITOR NAME & VERSION -MSG: DB CR,LF,FIL,FIL,FIL - DB "Zapple V" ; WW: CHANGED TO DQUOTES - DB "1.1" ; WW: CHANGED TO DQUOTES -MSGL: EQU $-MSG -; -; LET US BEGIN -; -; -; *NOTE- THE CODE UP TO THE 'IN SENSE' MAY -; BE REPLACED BY ENOUGH CODE TO INITIALIZE -; AN ACIA OR SIO DEVICE. ADDITIONAL DEVICES -; MAY BE INITIALIZED USING THE 'Q' COMMAND. -; (OR STANDARD ROUTINES FOR INITILIZATION -; MAY BE LOADED & EXECUTED IN THE USER AREA). -; -BEGIN: ;WW LD A,NN ;FOR 'I' REG. IF NEEDED. - ;WW LD I,A - ;WW NOP ;SPARE BYTE - ;WW XOR A ;CLEAR READER CONTROL PORT - ;WW OUT RCP,A -; - ;WW IN A,SENSE ;INITIALIZE I/O CONFIGURARTION - LD A,$FF ; WW - INIT IOBYT TO $FF (NOTE IT IS INVERTED WHEN USED) - OUT IOBYT,A - LD SP,AHEAD-4 ;SET UP A FAKE STACK - JP MEMSIZ+1 ;GET MEMORY SIZE - DEFW AHEAD -AHEAD: LD SP,HL ;SET TRUE STACK - EX DE,HL - LD BC,ENDX-EXIT - LD HL,EXIT - LDIR ;MOVE TO RAM - EX DE,HL - LD BC,-5FH ;SET UP A USER'S STACK VALUE - ADD HL,BC - PUSH HL ;PRE-LOAD USER'S STACK VALUE - LD HL,0 ;INITIALIZE OTHER REGISTERS - LD B,10 ; (16 OF THEM) -STKIT: PUSH HL ; TO ZERO - DJNZ STKIT -HELLO: LD B,MSGL ;SAY HELLO TO THE FOLKS - CALL TOM ;OUTPUT SIGN-ON MSG -START: LD DE,START ;MAIN 'WORK' LOOP - PUSH DE ;SET UP A RETURN TO HERE - CALL CRLF - LD C,'>' - CALL CO -STARO: CALL TI ;GET A CONSOLE CHARACTER - AND 7FH ;IGNORE NULLS - JR Z,STARO ;GET ANOTHER - SUB 'A' ;QUALIFY THE CHARACTER - RET M ;Z - ADD A ;A*2 - LD B,0 - LD C,A ;POINT TO PLACE ON TABLE - LD HL,TBL ;POINT TO COMMAND TABLE - ADD HL,BC ;ADD IN DISPLACEMENT - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL ;D&E=ROUTINE ADDRESS - LD C,2 ;SET C UP - JP (HL) ;GO EXECUTE COMMAND -; -; -; -TBL: - DEFW ASSIGN ;A - ASSIGN I/O - DEFW BYE ;B - SYSTEM SHUT-DOWN - DEFW COMP ;C - COMPARE MEMORY VS. READER INPUT - DEFW DISP ;D - DISPLAY MEMORY ON CONS. IN HEX - DEFW EOF ;E - END OF FILE TAG FOR HEX DUMPS - DEFW FILL ;F - FILL MEMORY WITH A CONSTANT - DEFW GOTO ;G - GOTO [ADDR] <,>BREAKPOINTS (2) - DEFW HEXN ;H - HEX MATH. , - DEFW ERROR ;I * USER DEFINED, INSERT VECTOR -; J=J ;VECTOR ADDR - DEFW TEST ;J - NON-DESTRUCTIVE MEMORY TEST - DEFW ERROR ;K * USER DEFINED, INSERT VECTOR -; J=J+3 ;VECTOR ADDR - DEFW LOAD ;L - MOVE A BINARY FORMAT FILE - DEFW MOVE ;M - MOVE BLOCKS OF MEMORY - DEFW NULL ;N - PUNCH NULLS ON PUNCH DEVICE - DEFW ERROR ;O * USER DEFINED, INSERT VECTOR -; J=J+3 ;VECTOR ADDR - DEFW PUTA ;P - 'PUT' ASCII INTO MEMORY. - DEFW QUERY ;Q - QI(N)=DISP. N; QO(N,V)=OUT N,V - DEFW READ ;R - READ A HEX FILE (W/CHECKSUMS) - DEFW SUBS ;S - SUBSTITUTE &/OR EXAMINE MEMORY - DEFW TYPE ;T - TYPE MEMORY IN ASCII - DEFW UNLD ;U - MEMORY TO PUNCH (BINARY FORMAT) - DEFW VERIFY ;V - COMPARE MEMORY AGAINST MEMORY - DEFW WRITE ;W - MEMORY TO PUNCH (HEX FORMAT) - DEFW XAM ;X - EXAMINE & MODIFY CUP REGISTERS - DEFW WHERE ;Y - FIND SEQUENCE OF BYTES IN RAM - DEFW SIZE ;Z - ADDRESS OF LAST R/W LOCATION -; -; -; -; THIS ROUTINE CONTROLS THE CONFIGURATION -; OF THE VARIOUS I/O DRIVERS & DEVICES. THIS IS -; ACCOMPLISHED VIA A HARDWARE READ/WRITE PORT. -; THIS PORT IS INITIALIZED UPON SIGN-ON -; BY THE VALUE READ ON PORT 'SENSE'. IF MAY BE -; DYNAMICALLY MODIFIED THROUGH CONSOLE COMMANDS. -; -; THE VALUE ON THE 'IOBYT' PORT REPRESENTS THE -; CURRENT CONFIGURATION. IT IS STURCTURED THUSLY: -; -; 000000XX - WHERE XX REPRESENTS THE CURRENT CONSOLE -; 0000XX00 - WHERE XX REPRESENTS THE CURRENT READER -; 00XX0000 - WHERE XX REPRESENTS THE CURRENT PUNCH -; XX000000 - WHERE XX REPRESENTS THE CURRENT LISTER -; -; WHEN USING A MEMORY LOCATION FOR IOBYT, THE -; POLARITY IS REVERSED. FOR AN I/O PORT, -; WHEN XX = 11, THE DEVICE IS ALWAYS THE -; TELEPRINTER. WHEN XX = 00, THE DEVICE IS ALWAYS -; USER DEFINED. SEE OPERATOR'S MANUAL FOR FURTHER -; DETAILS. -; -ASSIGN: CALL TI ;GET DEVICE NAME - LD HL,LTBL ;POINT TO DEVICE TABLE - LD BC,400H ;4 DEVICES TO LOOK FOR - LD DE,5 ;4 DEV. + IDENT. -..A0: CP (HL) ;LOOK FOR MATCH - JR Z,..A1 - ADD HL,DE ;GO THRU TABLE - INC C ;KEEP TRACK OF DEVICE - DJNZ ..A0 - JR ..ERR ;WRONG IDENTIFIER -..A1: LD E,C ;SAVE DEVICE NUMBER -..A2: CALL TI ;SCAN PAST '=' - CP '=' - JR NZ,..A2 - CALL TI ;GET NEW ASSIGNMENT - LD BC,400H ;4 POSSIBLE ASSIGNMENTS -..A3: INC HL ;POINT TO ASSIGNMENT NAME - CP (HL) ;LOOK FOR PROPER MATCH - JR Z,..A4 ;MATCH FOUND - INC C ;KEEP TRACK OF ASSIGNMENT NMBR - DJNZ ..A3 -..ERR: JP ERROR ;NO MATCH, ERROR -..A4: LD A,3 ;SET UP A MASK - INC E -..A5: DEC E ;DEVICE IN E - JR Z,..A6 ;GOT IT - SLA C ;ELSE MOVE MASKS - SLA C - RLA - RLA ;A=DEVICE MASK - JR ..A5 -..A6: CPL ;INVERT FOR AND'ING - LD D,A ;SAVE IN D -..A7: CALL PCHK ;WAIT FOR [CR] - JR NC,..A7 - CALL IOCHK ;GET PRESENT CONFIGURATION - AND D ;MODIFY ONLY SELECTED DEVICE - OR C ;'OR' NEW BIT PATTERN - LD C,A ;NEW CONFIGURATION -; -; THIS ALLOWS USER PROGRAMS TO MODIFY -; THE I/O CONDIGURATIMN DYNAMICALLY -; DURING EXECUTION. -; -IOSET: LD A,C ;NEW I/O BYTE PASSED IN C REE - CPL ;WE SAVE THE INVERTED BYTE - OUT IOBYT,A ;IN AN I/O PORT LATCH - RET -; -; THIS RETURNS THE CURRENT I/O -; CONFIGURATION IN THEE A REG. -; -IOCHK: IN A,IOBYT ;GET SAVED VALUE - CPL ;AND INVERT IT AGAIN - XOR A ; WW - RET -; -; -; THIS ROUTINE IS USED AS A SIMPLE MEANS TO PREVENT -; UNAUTHORIZED SYSTEM OPERATION. THE SYSTEM LOCKS UP, -; MONITORING FOR A 'CONT.-SHIFT-N', AT WHICH TIME IT -; WILL SIGN-ON AGAIN. NO REGISTER ASSIGHNMENTS OR I/O -; CONFIGURATIONS WILL BE ALTERED. -; -BYE: CALL CRLF -..BY: CALL KI - CP 1EH ;CONTROL-SHIFT-N - JR NZ,..BY - POP DE ;REMOVE THE RETURN - JP HELLO ;AND SIGN-ON AGAIN -; -; THIS ALLOW ENTERING OF ASCII TEXT INTO MEMORY -; FROM THE CONSOLE DEVICE. THE PARITY BIT IS CLEARED, -; AND ALL WILL BE STORED EXCEPT THE BACK-ARROR [ ] -; WHICH DELETES THE PREVIOUS CHARACTER, AND -; CONTROL-D, WHICH RETURNS CONTROL TO THE MONITOR. -; THIS COMMAND, COMBINED WITH THE 'Y' COMMAND, -; PROVIDES A RUDIMENTARY TEXT PROCESSING ABILITY. -; -PUTA: CALL EXPR1 ;GET THE STARTING ADDR. - CALL CRLF - POP HL -...A1: CALL KI ;GET A CHARACTER - CP 4 ;CONTROL-D? (EOT) - JP Z,LFADR ;YES, STOP & PRINT - CP 5FH ;ERASE MISTAKE? - JR Z,...A3 ; YES. - LD (HL),A ;ELSE STORE IT IN MEMORY - LD C,A - INC HL -...A2: CALL CO ;ECHO ON CONSOLE - JR ...A1 -...A3: DEC HL - LD C,(HL) - JR ...A2 ;ECHO & CONTINUE -; -; THIS ROUTINE COMPARES THE READER INPUT -; DEVICE WITH THE MEMORY BLOCK SPECIFIED. -; IT TESTS ALL EIGHT BITS, AND ANY DISCREPENCIES -; WILL BE OUTPUT TO THE CONSOLE. THIS IS USEFUL -; WHEN USED WITH THE BINARY DUMP DORMAT TO BOTH -; VERIFY PROPER READING & STORAGE, OR TO DETECT -; PROGRAM CHANGES SINCE IT WAS LAST LOADED. -; -COMP: CALL EXLF ;GET START ' STOP ADDR. -..C: CALL RIFF ;GET A FULL READER BYTE - CP (HL) ;8 BIT COMPARE - CALL NZ,CERR ;CALL IF INVALID COMPARE - CALL HILOX ;SEE IF RANGE SATISFIED - JR ..C -; -; THIS SUBROUTINE IS USED TO DISPLAY THE -; CURRENT LOCATION OF THE 'M' REGISTER POINTER (HL) , -; AND THE VALUE AT THE LOCATION, AND THE CONTENTS -; OF THE ACCUMULATOR. USED BY TWO ROUTINES. -; -CERR: LD B,A ;SAVE ACC. - CALL HLSP ;DISPLAY H&L - LD A,(HL) - CALL LBYTE ;PRINT 'M' - CALL BLK ;SPACE OVER - LD A,B - CALL LBYTE ;PRINT ACC. - JP CRLF ;CRLF & RETURN -; -; THIS DISPLAYS THE CONTENTS OF MEMORY IN BASE HEX -; WITH THE STARTING LOCATION ON EACH LINE. (BETWEEN -; THE TWO PARAMEETERS GIVEN). 16 BYTES PER LINE MAX. -; -DISP: CALL EXLF ;GET DISPLAY RANGE -..D0: CALL LFADR ;CRLF & PRINT ADDR. -..D1: CALL BLK ;SPACE OVER - LD A,(HL) - CALL LBYTE - CALL HILOX ;RANGE CHECK - LD A,L - AND 0FH ;SEE IF TIME TO CRLF - JR NZ,..D1 - JR ..D0 -; -; THIS OUTPUTS THE END OF FILE (EOF) PATTERN -; FOR THE CHECKSUM LOADER. IT IS USED AFTER -; PUNCHING A BLOCK OF MEMORY WITH THE 'W' -; COMMAND. AN ADDRESS PARAMETER MAY BE GIVEN, -; AND UPON READING, THIS ADDRESS WILL BE -; AUTOMATICALLY PLACED INT THE 'P' COUNTER. THE -; PROGRAM CAN THEN BE RUN WITH A SIMPLE 'G[CR]' -; COMMAND. -; -EOF: CALL EXPR1 ;GET OPTIONAL ADDR. - CALL PEOL ;CRLF TO PUNCH - LD C,':' ;FILE MARKER CUE - CALL PUO - XOR A ;ZERO LENGTH - CALL PBYTE - POP HL - CALL PADR ;PUNCH OPTIONAL ADDR. - LD HL,0 ;FILE TYPE=0 - CALL PADR ;PUNCH IT - JP NULL ;TRAILER & RETURN -; -; THIS COMMAND WILL FILL A BLOCK OF MEMORY -; WITH A VALUE. IE; FO,1FFF,0 FILLS FROM -; <1> TO <2> WITH THE BYTE <3>. HANDY FOR -; INITIALIZING A BLOCK TO A SPECIFIC VALUE, OR -; MEMORY TO A CONSTANT VALUE BEFOR LOADING -; A PROGRAM. (ZERO IS ESPECIALLY USEFUL.) -; -FILL: CALL EXPR3 ;GET 3 PARAMEETERS -..F: LD (HL),C ;STORE THE BYTE - CALL HILO - JR NC,..F - POP DE ;RESTORE STACK - JP START ; IN CASE OF ACCIDENTS -; -; THIS COMMAND ALLOWS EXECUTION OF ANOTHER -; PROGRAM WHILE RETAINING SOME MONITOR -; CONTROL BY SETTING BREAKPOINTS. -; -; TO SIMPLY EXECUTE, TYPE 'G[CR]'. TO SET -; A BREAKPOINT TRAP, ADD THE ADDRESS (ES) TO THE -; COMMAND. IE; G,[CR]. TWO BREAKPOINTS -; ARE ALLOWED, ENOUGH TO SATISFY MOST REQUIREMENTS. -; ONCE A BREAKPOINT HAS BEEN REACHED, THE -; REGISTERS MAY BE EXAMINED OR MODIFIED. THE -; PROGRAM CAN THEN BE CONTINUED BY TYPING ONLY -; A 'G[CR]'. OR ANOTHER BREAKPOINT COULD BE -; IMPLEMENTED AT THAT TIME BY TYPING 'G,[CR]'. -; -; *NOTE: THIS IS SOFTWARE CONTROLLED, AND THE -; BREAKPOINT MUST OCCUR ON AN INSTRUCTION -; BYTE. -; -GOTO: CALL PCHK ;GET A POSSIBLE ADDRESS - JR C,..G3 ;CR ENTERED - JR Z,..G0 ;DELIMETER ENTERED - CALL EXF ;GET ONE EXPRESSION - POP DE - LD HL,PLOC ;PLACE ADDRESS IN 'P' LOCATION - ADD HL,SP - LD (HL),D ;HIGH BYTE - DEC HL - LD (HL),E ;LOW BYTE - LD A,B - CP CR ;SEE IF LAST CHARACTER WAS A CR - JR Z,..G3 ;YES, LEAVE -..G0: LD D,2 ;TWO BREAKPOINTS MAX - LD HL,TLOC ;POINT TO TRAP STORAGE - ADD HL,SP -..G1: PUSH HL ;SAVE STORAGE POINTER - CALL EXPR1 ;GET A TRAP ADDRESS - LD E,B ;SAVE DELIMITER - POP BC ;TRAP ADDR. - POP HL ;STORAGE - LD A,B ;LOOK AT TRAP ADDR - OR C - JR Z,..G2 ;DON'T SET A TRAP AT 0 - LD (HL),C ;SAVE BKPT ADDR - INC HL - LD (HL),B - INC HL - LD A,(BC) ;PICK UP INST. BYTE - LD (HL),A ;SAVE THAT TOO - INC HL - LD A,0FFH ;RST 7 - LD (BC),A ;SOFTWARE INTERUPT -..G2: LD A,E ;LOOK AT DEELIMITER - CP CR - JR Z,..G2A - DEC D ;COUNT BKPTS - JR NZ,..G1 ;GET ONE MORE -..G2A: LD A,0C3H ;SET UP JUMP INSTRUCTION - LD (RST7),A ; AT RESTART TRAP LOC. - LD HL,TRAP ; TO MONITOR VECTOR - LD (RST7+1),HL -..G3: CALL CRLF - POP DE ;CLEAR SYSTEM RETURN - LD HL,22 ;FIND 'EXIT' ROUTINE - ADD HL,SP ;UP IN STACK - JP (HL) ;GO SOMPLACE -; -; THIS IS A 'QUICKIE' MEMORY TEST TO SPOT -; HARD MEMORY FAILURES, OR ACCIDENTLY -; PROTECTED MEEMORY LOCATIONS. IT IS NOT -; MEANT TO BE THE DEFINITIVE MEMORY DIAGNOSTIC. -; IT IS, HOWEVER, NON-DESTRUCTIVEE. ERRORS ARE -; PRINTED ON THE CONSOLE AS FOLLOWS- -; 00000100 WHERE <1> IS THE BAD BIT. -; BIT LOCATION OF THE FAILURE IS EASILY -; DETERMINED. NON-R/W MEMORY WILL RETURN -; WITH- 11111111 -; -TEST: CALL EXLF ;GET TWO PARAMS -...T1: LD A,(HL) ;READ A BYTE - LD B,A ;SAVE IN B REG. - CPL - LD (HL),A ;READ/COMPLIMENT/WRITE - XOR (HL) ; & COMPARE - JR Z,...T2 ;SKIP IF ZERO (OK) - PUSH DE ;SAVE END POINTER - LD D,B ;SAVE BYTE - LD E,A ;SET-UP TO DISPLAY - CALL HLSP ;PRINT BAD ADDR - CALL BITS ;PRINT BAD BIT LOC. - CALL CRLF - LD B,D ;RESTORE BYTE - POP DE ;RESTORE DE -...T2: LD (HL),B ;REPLACE BYTE - CALL HILOX ;RANGE TEST - JR ...T1 -; -; THIS COMMAND MOVES MASS AMOUNTS OF MEMORY -; FROM <1> THRU <2> TO THE ADDRESS STARTING -; AT <3>. THIS ROUTINE SHOULD BE USED WITH -; SOME CAUTION, AS IT COULD SMASH MEMORY IF -; CARLESSLY IMPLEMENTED. -; -; M<1>,<2>,<3> -; -MOVE: CALL EXPR3 ;GET 3 PARAMTERS -..M: LD A,(HL) ;PICK UP - LD (BC),A ;PUT DOWN - INC BC ;MOVE UP - CALL HILOX ;CHECK IF DONE - JR ..M -; -; THIS COMMAND READS THE CHECK-SUMMED HEX FILES -; FOR BOTH THE NORMAL INTEL FORMAT AND THE TDL -; RELOCATING FORMAT. ON BOTH FILES, A 'BIAS' MAY -; BE ADDED, WHICH WILL CAUSE THE OBJECT CODE TO -; BE PLACED IN A LOCATION OTHER THAN ITS -; INTENDED EXECUTION LOCATION. THE BIAS IS ADDED -; TO WHAT WOULD HAVE BEEN THE NORMAL LOADING -; LOCATION, AND WILL WRAP AROUND TO ENABLE -; LOADING ANY PROGRAM ANYWHERE IN MEMORY. -; -; WHEN LOADING A RELOCATABLE FILE, AN ADDITIONAL -; PARAMETER MAY BE ADDED, WHICH REPRESENTS THE -; ACTUAL EXECUTION ADDRESS DESIRED. THIS ALSO MAY -; BE ANY LOCATION IN MEMORY. -; -; EXAMPLES: -; -; R[CR] =0 BIAS, 0 EXECUTION ADDR. -; R[CR] =<1>BIAS, 0 EXECUTION ADDR. -; R,[CR] =0 BIAS, <1> EXECUTION ADDR. -; R,[CR] =<1>BIAS, <2>EXECUTION ADDR. -; -READ: CALL EXPR1 ;GET BIAS, IF ANY - LD A,B ;LOOK AT DELIMITER - SUB CR ;ALL DONE? - LD B,A ;SET UP RELOCATION OF 0 - LD C,A ; IF CR ENTERED - POP DE ;BIAS AMOUNT - JR Z,..R0 ;CR ENTERED - CALL EXPR1 ;GET RELOCATION - POP BC ;ACTUAL RELOCATION VALUE -..R0: EX DE,HL - EXX ;HL'=BIAS, BC'=RELOCATION - CALL CRLF -LOD0: CALL RIX ;GET A CHARACTER - SUB ':' ;ABSOLUTE FILE CUE? - LD B,A ;SAVE CUE CLUE - AND 0FEH ;KILL BIT 0 - JR NZ,LOD0 ; NO, KEEP LOOKING - LD D,A ;ZERO CHECKSUM - CALL SBYTE ;GET FILE LENGTH - LD E,A ;SAVE IN E REG. - CALL SBYTE ;GET LOAD MSB - PUSH AF ;SAVE IT - CALL SBYTE ;GET LOAD LSB - EXX ;CHANGE GEARS - POP DE ;RECOVER MSB - LD E,A ;FULL LOAD ADDR - PUSH BC ;BC'=RELOCATION - PUSH DE ;DE'=LOAD ADDR - PUSH HL ;HL'=BIAS - ADD HL,DE ; BIAS+LOAD - EX (SP),HL ;RESTORE HL' - POP IX ; X=BIAS+LOAD - EXX ;DOWNSHIFT - POP HL ;HL=LOAD ADDR - CALL SBYTE ;GET FILE TYPE - DEC A ;1=REL. FILE, 0=ABS. - LD A,B ;SAVE CUE BIT - POP BC ;BC=RELOCATION - JR NZ,..A ;ABSOLUTE FILE - ADD HL,BC ;ELSE RELMCATE - ADD IX,BC ;BOTH X & HL -..A: INC E ;TEST LENGHT - DEC E ;0=DONE - JR Z,DONE - DEC A ;TEST CUE - JR Z,LODR ;RELATIVE -..LI: CALL SBYTE ;NEXT - CALL STORE ;STORE IT - JR NZ,..L1 ;MORE COMING -LOD4: CALL SBYTE ;GET CHECKSUM - JR Z,LOD0 ;GOOD CHECKSUM -ERR3: PUSH IX - POP HL ;TRANSFER - CALL LADR ;PRINT CURRENT LOAD ADDR -ERR2: JP ERROR ;ABORT -DONE: LD A,H ;DON'T MODIFY IF ZERO - OR L - RET Z - EX DE,HL ;ELSE STORE IN PC - LD HL,PLOC - ADD HL,SP - LD (HL),D ;IN STACK AREA - DEC HL - LD (HL),E - RET -LODR: LD L,1 ;SET-UP BIT COUNTER -..L1: CALL LODCB ;GET THE BIT - JR C,..L3 ;DOUBLE BIT -..L5: CALL STORE ;WRITE IT - JR NZ,..L1 - JR LOD4 ;TEST CHECKSUM -..L3: LD C,A ;SAVE LOW BYTE - CALL LODCB ;NEXT CONTROL BIT - LD B,A ;SAVE HIGH BYTE - EXX - PUSH BC ;GET RELOCATION - EXX - EX (SP),HL ;INTO HL - ADD HL,BC ;RELOCATE - LD A,L ;LOW BYTE - CALL STORE ;STORE IT - LD A,H ;HIGH BYTE - POP HL ;RESTORE HL - JR ..L5 ;DO THIS AGAIN -LODCB: DEC L ;COUNT BITS - JR NZ,..LC1 ;MORE LEFT - CALL SBYTE ;GET NEXT - DEC E ;COUNT BYTES - LD H,A ;SAVE THE BITS - LD L,8 ;8 BITS/BYTE -..LC1: CALL SBYTE ;GET A DATA BYTE - SLA H ;TEST NEXT BIT - RET -SBYTE: PUSH BC ;PRESERVE BC - CALL RIBBLE ;GET A CONVERTED ASCII CHAR. - RLCA - RLCA - RLCA - RLCA ;MOV IT TO HIGH NIBBLE - LD C,A ;SAVE IT - CALL RIBBLE ;GET OTHER HALF - OR C ;MAKE WHOLE - LD C,A ;SAVE AGAIN IN C - ADD D ;UPDATE CHECKSUM - LD D,A ;NEW CHECKKSUM - LD A,C ;CONVERTED BYTE - POP BC - RET -STORE: LD (IX),A ;WRITE TO MEMORY - CP (IX) ;VALID WRITE? - JR NZ,ERR3 ; NO. - INC IX ;ADVANCE POINTER - DEC E ;COUNT DOWN - RET -; -; THIS ROUTINE ALLOWS BOTH INSPECTION OF & -; MODIFICATION OF MEMORY ON A BYTE BY BYTE -; BASIS. IT TAKES ONE ADDRESS PARAMETER, -; FOLLOWED BY A SPACE. THE DATA AT THAT -; LOCATION WILL BE DISPLAYED. IF IT IS -; DESIRED TO CHANGE IT, THE VALUE IS THEN -; ENTERED. A FOLLOWING SPACE WILL DISPLAY -; THE NEXT BYTE. A CARRIAGE RETURN [CR] -; WILL TERMINATE THE COMMAND. THE SYSTEM -; ADDS A CRLF AT LOCATIONS ENDING WITH EITHER -; XXX0 OR XXX8 TO AID IN DTERMINING THE -; PRESENT ADDRESS, IT IS PRINTED AFTER -; EACH CRLF. A BACKARROW [ ] WILL BACK -; UP THE POINTER AND DISPLAY THE -; PREVIOUS LOCATION. -; -SUBS: CALL EXPR1 ;GET STARTING ADDR - POP HL -..S0: LD A,(HL) - CALL LBYTE ;DISPLAY THE BYTE - CALL COPCK ;MODIFY? - RET C ; NO, ALL DONE - JR Z,..S1 ;DON'T MODIFY - CP 05FH ;BACKUP? - JR Z,..S2 - PUSH HL ;SAVE POINTER - CALL EXF ;GET NEW VALUE - POP DE ;VALUE IN EE - POP HL - LD (HL),E ;MODIFY - LD A,B ;TEST DELIMITER - CP CR - RET Z ;DONE -..S1: INC HL -..S3: LD A,L ;SEE IF TIME TO CRLF - AND 7 - CALL Z,LFADR ;TIME TO CRLF - JR ..S0 -..S2: DEC HL ;DECREMENT POINTER - JR ..S3 ;AND PRINT DATA THERE. -; -; THIS ROUTINE TRANSLATES THE DATA IN -; MEMORY TO AN ASCII FORMAT. ALL NON- -; PRINTING CHARACTERS AREE CONVERTED TO -; PERIODS. [.] -; THERE ARE 64 CHARACTERS PER LINE. -; -TYPE: CALL EXLF ;DISPLAY RANGE -..T0: CALL LFADR ;DISPLAY ADDRESS - LD B,64 ;CHARACTERS PER LINE -..T1: LD A,(HL) - AND 7FH ;KILL PARITY BIT - CP ' ' ;RANGE TEST - JR NC,..T3 ;=>SPACEE -..T2: LD A,'.' ;REPLACE NON-PRINTING -..T3: CP 07CH ;ABOVE LOWER CASE z - JR NC,..T2 - LD C,A ;SEND IT - CALL CO - CALL HILOX ;MORE TO GO? - DJNZ ..T1 ;SEE FI TIME TO CRLF - JR ..T0 ;YES -; -; THIS IS A HEXADECIMAL SEARCH ROUTINE. IT -; TAKES NO ADDRESS PARAMETERS. AS MANY -; BYTES MAY BE ENTERED, SEPERATED BY A COMMA, -; AS DESIRED. THE MAXIMUM IS 255, BUT 3-4 IS -; TYPICAL, AND MORE THAN 12 WOULD BE UNUSUAL. -; THE ENTIRE MEMORY IS SEARCHED STARTING -; FROM ZERO, AND ALL STARTING ADDRESSES OF EACH -; OCCURANCE OF THE SEARCH STRING ARE PRINTED -; ON THE CONSOLE DEVICE. -; -WHERE: LD D,0 ;COUNT SEARCH STRING -...W0: CALL EXPR1 ;GET ONE BYTE - POP HL ;PICK IT UP - LD H,L ;STICK IN HIGH BYTE - PUSH HL ;PUT IT IN STACK - INC SP ;ADJUST STACK - INC D ;COUNT UP - LD A,B ;TEST DELIMITER - SUB CR - JR NZ,...W0 ;MORE TO GO - LD B,A ;CHEAP ZEROS - LD C,A - LD H,A - LD L,D ;GET BYTE COUNT IN L - DEC L ;-1 - ADD HL,SP ;BYTES STORED IN STACKK - PUSH HL - PUSH BC -FINDC: PUSH BC ;SAVE THAT POINTER - CALL CRLF - POP BC ;RESTORE -FIND: POP HL ;HL=SEARCH ADDR - POP IX ;X=SEARCH BYTE POINTER - LD E,D ;RESET COUNTER - LD A,(IX) ;GET THE FIRST SEARCH BYTE - CPIR ;COMPARE, INCR., & REPEAT - JP PO,DONE ;ODD PARITY=DONE - PUSH IX ;SAVE POINTERS - PUSH HL -FOUND: DEC E - JR Z,TELL ;FOUND ALL - LD A,(IX-1) ;LOOK AT NEXT MATCH - CP (HL) ;TEST NEXT - JR NZ,FIND ;NO MATCH - INC HL ;BUMP POINTER - DEC IX - JR FOUND ;TEST NEXT MATCH -TELL: POP HL - PUSH HL - DEC HL - PUSH BC ;SAVE SEARCH COUNT LIMIT - CALL LADR ;TELL CONSOLE - POP BC ;RESTORE - JR FINDC -DONE2: INC SP - DEC E ;RESET STACK - JR NZ,DONE2 - RET -; -; THIS ROUTINE DUMPS MEMORY IN THE STANDARD -; INTEL HEX-FILE FORMAT. A START & END -; PARAMETER IS REQUIRED. AT THE CONCLUSION -; OF THE DUMP, AND "END OF FILE" SHOULD BE -; GENERATED WITH THE "E" COMMAND. -; -WRITE: CALL EXLF ;GET TWO PARAMETERS - CALL WAIT ;PAUSE IF TTY CONFIGURATION -..W0: CALL PEOL ;CRLF TO PUNCH - LD BC,':' ;START OF FILE - CALL PUO ;PUNCH IT - PUSH DE ;SAVE - PUSH HL ;POINTERS -..W1: INC B ;CALCULATE FILE LENGTH - CALL HILO - JR C,..W4 ;SHORT FILE - LD A,24 ;24 BYTES PER FILE - SUB B ;ENOUGH YET? - JR NZ,..W1 ; NO. - POP HL ;GET START ADDR BACK. - CALL ..W2 ;SEND THE BLOCK - POP DE ;RESTORE END OF FILE POINTER - JR ..W0 ;KEEP GOING -..W2: LD D,A ;INITIALIZE CHECKSUM - LD A,B ;FILE LENGTH - CALL PBYTE ;PUNCH IT - CALL PADR ;PUNCH ADDRESS - XOR A ;FILE TYPE=0 - CALL PBYTE ;PUNCH IT -..W3: LD A,(HL) ;GET A DATA BYTE - CALL PBYTE ;PUNCH IT - INC HL ;POINT TO NEXT BYTE - DJNZ ..W3 ;DECREMENT FILE COUNT - XOR A - SUB D ;CALCULATE CHECKSUM - JP PBYTE ;PUNCH IT, RETURN -..W4: POP HL ;CLEAR STACK - POP DE ; OF POINTERS - XOR A ;SET UP A - JR ..W2 ;FINISH UP & RETURN -; -; -; THIS ROUTINE ALLOWS DISPLAYING THE -; USER'S CPU REGISTERS. THEY ALSO MAY BE -; USING THE REGISTER NAME AFTER TYPEINT THE "X". -; I.E. XA 00- -; THE REGISTER MAY BE SKIPPED OVER, OR MODIFIED, -; SIMILARLY TO THE "S" COMMAND. -; -; TO DISPLAY THE "NORMAL" SYSTEM STATUS, -; SIMPLY TYPE "X[CR]". TO DISPLAY THE -; ADDISTIONAL Z-80 REGISTERS, FOLLOW -; THE "X" WITH AN APOSTROPHE. I.E. "X'[CR]", -; OR TO EXAMINE A SINGLE "PRIME" REGISTER, -; TYPE THE REGISTER IDENTIFIER AFTER THE -; APOSTROPHE. I.E. X'X 0000- -; -; THESE REGISTER VALUES ARE PLACED INTO THE CPU -; UPON EXECUTING ANY "GO" COMMAND. [G] -; -XAM: CALL TI - LD HL,ACTBL - CP CR ;FULL REG. DISPLAY - JR Z,..X6 - CP 2CH ;SEE IF PRIMES WANTED - JR NZ,..X0 - LD HL,PRMTB - CALL TI - CP CR ;FULL REG. DISPLAY - JR Z,..X6 -..X0: CP (HL) ;TEST FOR REGISTER NAME - JR Z,..X1 - BIT 7,(HL) ;SEE IF END OF TABLE - JP NZ,ERROR - INC HL - INC HL - JR ..X0 -..X1: CALL BLK -..X2: INC HL - LD A,(HL) - LD B,A ;SAVE FOR FLAGS - AND 3FH ;CLEAR FLAGS FOR BIAS - EX DE,HL - LD L,A ;DISPLACEMENT FROM STACK - LD H,0 - ADD HL,SP - EX DE,HL - INC HL - LD A,(DE) ;PICK UP REG. VALUE - CALL LBYTE ;PRINT IT - BIT 7,B - JR Z,..X3 - DEC DE - LD A,(DE) - CALL LBYTE -..X3: CALL COPCK ;MODIFY - RET C ;CR ENTERED, ALL DONE - JR Z,..X5 ;SKIP TO NEXT REG. - PUSH HL - PUSH BC - CALL EXF ;GET NEW VALUE - POP HL - POP AF - PUSH BC - PUSH AF - LD A,L - LD (DE),A - POP BC - BIT 7,B ;SEE IF 8 BIT OR 16 BIT REG. - JR Z,..X4 ;8 BIT - INC DE - LD A,H ;HIGH BYTE OF 16 BIT REG. - LD (DE),A -..X4: POP BC - POP HL - LD A,B ;TEST DELIMITER - CP CR - RET Z ;CR ENTRED, ALL DONE -..X5: BIT 7,(HL) ;SEE IF END OF TABLE - RET NZ ;RETURN IF SO - JR ..X2 -..X6: CALL CRLF -..X7: CALL BLK - LD A,(HL) - INC HL - OR A - RET M - LD C,A - CALL CO - LD C,'=' - CALL CO - LD A,(HL) - LD B,A ;SAVE FLAGS - AND 3FH ;CLEAR UP FOR OFFSET - INC HL - EX DE,HL - LD L,A - LD H,0 - ADD HL,SP - EX DE,HL - BIT 6,B ;TEST FOR SPECIAL "M" - JR NZ,..X9 ;PRINT OUT ACTUAL "M" - LD A,(DE) - CALL LBYTE ;PRINT REG. VALUE - BIT 7,B ;SINGLE OR DOUBLE? - JR Z,..X7 ;SINGLE. - DEC DE - LD A,(DE) -..X8: CALL LBYTE - JR ..X7 -..X9: PUSH HL ;SAVE HL - LD A,(DE) ;GET REG. POINTER - LD H,A ;HIGH BYTE - DEC DE - LD A,(DE) - LD L,A ;LOW BYTE - LD A,(HL) ;GET VALUE - POP HL ;RESTORE HL - JR ..X8 ;PRINT VALUE & CONTINUE -; -; THIS IS A MESSAGE OUTPUT ROUTINE. -; IT IS USED BY THE SIGN-ON AND THE CRLF. -; POINTER IS IN HL (WHEN ENTERED AT -; TOM1) AND LENGTH IN B REG. -; -TOM: LD HL,MSG -TOM1 LD C,(HL) ;GET A CHARACTER - INC HL ;MOVE POINTER - CALL CO ;OUTPUT IT - DJNZ TOM1 ;KEEP GOILG TILL B=0 - CALL CSTS ;SEE IF AN ABORT REQUEST - OR A ; WAITING - RET Z ;NO. -; -; SEE IF CONTROL-C IS WAITING -; ABMRT IF SO. -CCHK: CALL KI - CP 3 ;CONTROL-C? - RET NZ -; -; SYSTEM ERROR ROUTINE. THIS -; WILL RESTORE THE SYTEM AFTER -; A SYSTEM ERROR HAS BEEN TAKEN. -; THE I/O CONFIGURATION IS NOT -; AFFECTED. -; -ERROR: CALL MEMSIZ - LD DE,-22 ;STACK POINTER OFFSET - ADD HL,DE - LD SP,HL - LD C,'*' ;ANNOUNCE ERROR - CALL CO - JP START ;BACK TO WORK -; -; THIS GETS A READER CHARACTER, -; AND COMPARES IT WITH THE 'D' REG. -; IT ABORTS ON AND 'OUT-OF-DATA' -; CONDITION. -; -RIFF: CALL RI ;GET READER CHARACTER - JR C,ERROR ;ABORT ON CARRY - CP D ;TEST D - RET -; -; THIS ROUTINE WILL RETURN THE -; CURRENT VALUE OF THE HIGHEST -; READ/WRITE MEMORY LOCATION THAT -; IS AVAILABLE ON THE SYSTEM. -; IT WILL "SEARCH" FOR MEMORY -; STARTING AT THE BOTTOM OF MEMORY -; AND GO UPWARDS UNTIL NON-R/W MEMORY -; IS FOUND. -; -SIZE: CALL MEMSIZ ;GET THE VALUE - LD BC,ENDX-EXIT - ADD HL,BC ;ADJUST IT -; -; -; CRLF BEFORE HLSP ROUTINE -; -LFADR: CALL CRLF -; -; PRINT THE CURRENT VALUE OF H&L, -; AND A SPACE. -; -HLSP: CALL LADR -; -; PRINT A SPACE ON THE CONSOLE -; -BLK: LD C,' ' -; -; THIS IS THE MAIN CONSOLE -; OUTPUT ROUTINE -; -CO: CALL IOCHK - AND NOT CMSK - JR NZ,CO0 -; -; TELEPRINTER CONFIGURATION -; I/O DRIVER. -; -TTYOUT: IN A,TTS - AND TTYBE - JR Z,TTYOUT ; WW: NZ -> Z - LD A,C - OUT TTO,A - RET -CO0: DEC A ;CCRT? - JR NZ,CO1 ; NO. -; -; C.R.T. CONFIGURATION DRIVER. -; -CRTOUT: IN A,CRTS - AND CRTBE - JR NZ,CRTOUT - LD A,C - OUT CRTO,A - RET -; -CO1: DEC A ;BATCH - JP NZ,COLOC ; NO, MUST BE USER -; -; LIST OUTPUT DRIVER ROUTINE -; -A USER VECTORED ROUTINE, USED -; BYT THE ASSEMBLER, ETC. ALSO, -; WHEN THE ASSIGNED MODE IS "BATCH", -; THIS IS THE ROUTINE USED FOR THE -; MONITOR OUTPUT THAT WOULD NORMALLY -; GO TO THE "CONSOLE". -; -LO: CALL IOCHK - AND NOT LMSK - JR Z,TTYOUT - CP LCRT - JR Z,CRTOUT - CP LINE - JP Z,LNLOC ;EXTERNAL VECTOR - JP LULOC ;USER DEFINED VECTOR -; -; SEND CRLF TO PUNCH DEVICE -; -PEOL: LD C,CR - CALL PUO - LD C,LF -; -; PUNCH OUTPUT DRIVER ROUTINE -; -PUO: CALL IOCHK - AND NOT PMSK - JR Z,TTYOUT ;PUNCH=TELEPRINTER - CP PCAS ;CASSETTE? - JR NZ,PO1 ; NO. -; -PO0: IN A,PCASS - AND PCSBE - JR NZ,PO0 - LD A,C - OUT PCASO,A - RET -; -PO1: CP PPTP - JP Z,PTPL ;EXTERNAL VECTOR - JP PULOC ;USER VECTOR -; -; -; THIS IS A BINARY DUMP ROUTINE THAT MAY BE -; USED WITH BOTH PAPER-TAPE AND/OR CASSETTE -; SYSTEMS. IT PUNCHES A START-OF-FILE MARK -; AND THEN PUNCHES IN FULL 8-BITS DIRECTLY -; FROM MEMORY. IT IS FOLLOWED BY AN END-OF- -; FILE MARKER. THESE DUMPS MAY BE LOADED -; USING THE "L" COMMAND. THEY ARE USEFUL -; FOR FAST LOADING, AND MAY BE VERIFIED -; USING THE "C" (COMPARE) COMMAND. -; -; U,[CR] -; PUNCHES FROM THRU -; -UNLD: CALL EXLF ;GET TWO PARAMETERS - CALL WAIT ;PAUSE FOR PUNCH-ON (TTY) - CALL LEAD ;PUNCH LEADER - CALL MARK ;PUNCH FILE MARKER -..U: LD C,(HL) ;GET MEMORY BYTE - CALL PUO ;PUNCH IT - CALL HILO ;SEE IF DONE - JR NC,..U - CALL MARK ;PUNCH END OF FILE MARKER -; -; THIS PUNCHES NULLS (LEADER/TRAILER). -; IT RETURNS "QUIET" IN CASE THE PUNCH -; AND CONSOLE ARE THE SAME. -; -NULL: CALL LEAD ;PUNCH NULLS -; -; THIS ROUTINE WILL PAUSE FOR -; A KEYBOARD CHARACTER. IT IS -; USED AS A DELAY TO GIVE THE -; OPERATOR TIME TO TURN ON THE -; TELEPRINTER PUNCH BEFORE SENDING -; A HEX FILE OR BINARY FILE TO -; THE PUNCH. IT WIL SIMPLY -; RETURN IF THE PUNCH & CONSOLE -; ARE NO BOTH ASSIGNED TO THE -; DEFAULT. (TELEPRINTER) -; -WAIT: CALL IOCHK - AND ~CMSK | ~PMSK ; WW: WAS "AND NOT CMSK OR NOT PMSK" - RET NZ - JP STARO ;RETURN "QUIET" -; -; CONVERT HEX TO ASCII -; -CONV: AND 0FH ;LOW NIBBLE ONLY - ADD 90H - DAA - ADC 40H - DAA - LD C,A - RET -; -; GET TWO PARAMETERS, PLACE -; THEM IN DE & HL, AND THEN -; CRLF. -; -EXLF: CALL EXPR - POP DE - POP HL -; -; CONSOLE CARRIAGE RETURN & -; LINE FEED ROUTINE. -; -; THE NUMBER OF FILL CHARACTERS -; MAY BE ADJUSTED TO 0-3 BY THE -; VALUE PLACED IN THE B REG. MINIMUM -; VALUE FOR "B" IS TWO (2). MAXIMUM -; IS FIVE (5). -; -CRLF: PUSH HL ;SAVE HL - ;WW LD B,4 ;CRLF LENGTH (SET FOR 2 FILLS) - LD B,2 ; WW - CHANGE TO ZERO FILLS - CALL TOM ;SEND CRLF - POP HL - RET -; -; I -; TEST THE CURRENT CONSOLES -; KEYBOARD FOR A KEY-PRESS -; RETURN TRUE (0FFH IN A REG) -; IF THERE IS A CHARACTER -; WAITING IN THE UART. -; -CSTS: CALL IOCHK - AND NOT CMSK - JR NZ,CS0 - IN A,TTS - JR CS1 -CS0: DEC A ;CCRT - JR NZ,CS3 - IN A,CRTS -CS1: AND TTYDA - LD A,FALSE -CS2: RET Z ; WW: NZ -> Z - CPL - RET -CS3: DEC A ;BATCH - RET Z - JP CSLOC ;USED DEFINED FUNCTION -; -; GET THREE PARAMETERS AND -; CRLF. -; -EXPR3: INC C - CALL EXPR - CALL CRLF - POP BC - POP DE - POP HL - RET -; -; GET ONE PARAMETER. -; NO CRLF. -; -EXPR1: LD C,1 -; -; THIS IS THE MAIN "PARAMETER-GETTING" ROUTINE. -; THIS ROUTINE WILL ABORT ON A NON-HEX CHARACTER. -; IT TAKES THE MOST RECENTELY TYPED FOUR VALID -; HEX CHARACTERS, AND PLACES THEM UP ON THE STACK. -; (AS ONE 16 BIT VALUE, CONTAINED IN TWO -; 8-BIT BYTES.) IF A CARRIAGE RETURN IS ENTERED, -; IT WILL PLACE THE VALUE OF "0000" IN THE STACK. -; -EXPR: LD HL,0 ;INITIALIZE HL TO ZERO -EX0: CALL TI ;GET SOMETHING FROM CONSOLE -EX1: LD B,A ;SAVE IT - CALL NIBBLE ;CONVERT ASCII TO HEX - JR C,..EX2 ;ILLEGAL CHARACTER DECTECTED - ADD HL,HL ;MULTIPLY BY 16 - ADD HL,HL - ADD HL,HL - ADD HL,HL - OR L ;OR IN THE SINGLE NIBBLE - LD L,A - JR EX0 ;GET SOME MORE -..EX2: EX (SP),HL ;SAVE UP IN STACK - PUSH HL ;REPLACE THE RETURN - LD A,B ;TEST THE DELIMITER - CALL QCHK - JR NC,..EX3 ;CR ENTERED - DEC C ;SHOULD GO TO ZERO - RET Z ; RETURN IF IT DOES -..EX3: JP NZ,ERROR ;SOMETHING WRONG - DEC C ;DO THIS AGAIN? - JR NZ,EXPR ; YES. - RET ;ELSE RETURN -EXF: LD C,1 - LD HL,0 - JR EX1 -; -; RANGE TESTING ROUTINES. -; CARRY SET INDICATES RANGE EXCEEDED. -; -HILOX: CALL HILO - RET NC ;OK - POP DE ;RETURN ONE LEVEL BACKK - RET -; -HILO: INC HL ;INCREMENT HL - LD A,H ;TEST FOR CROSSING 64K BORDER - OR L - SCF ;CARRY SET=STOP - RET Z ;YES, BORDER CROSSED - LD A,E ;NOW, TEST HL VS. DE - SUB L - LD A,D - SBC H - RET ;IF CARRY WAS SET, THEN STOP -; -; HEXADECIMAL MATH ROUTINE -; -; THIS ROUTINE IS USEFUL FOR -; DETERMINING RELATIVE JUMP -; OFFSETS. IT RETURNS THE SUM -; & DIFFERENCE OF TWO PARAMETERS. -; -; H, -; -; X+Y X-Y -; -HEXN: CALL EXLF - PUSH HL ;SAVE HL FOR LATER - ADD HL,DE ;GET SUM - CALL HLSP ;PRINT IT - POP HL ;THIS IS LATER - OR A ;CLEAR CARRY - SBC HL,DE ;GET DIFFERENCE & PRINT IT -; -; PRINT H&L ON CONSOLE -; -LADR: LD A,H - CALL LBYTE - LD A,L -LBYTE: PUSH AF - RRCA - RRCA - RRCA - RRCA - CALL ..2 - POP AF -..2: CALL CONV - JP CO -; THIS ROUTINE SENDS EIGHT RUBOUTS -; TO THE PUNCH DEVICE. -; -MARK: LD BC,08FFH ;SET-UP B&C - JR LE0 -; -; THIS ROUTINE SENDS BLANKDS TO THE -; PUNCH DEVICE. -; -LEAD: LD BC,4800H ;PRESET SOME NULLS -LE0: CALL PUO - DJNZ LE0 - RET -; -; THIS ROUTINE RETURNS TO A USER -; PROGRAM THE CURRENT TOP OF -; MEMORY VALUE MINUS WORKSPACE -; AREA USED BY THE MONITOR. -; -MEMCK: PUSH HL - CALL MEMSIZ - LD A,L - SUB 2CH - JR NC,...B - DEC H -...B: LD B,H - POP HL - RET -; -; THIS IS A CALLED ROUTINE USED -; TO CALCULATE THE TOP OF MEMORY -; STARTING FROM THE BOTTOM OF -; MEMORY, AND SEARCHING UPWARD UNTIL -; FIRST R/W MEMORY IS FOUND, AND THEN -; CONTINUING UNTIL THE END OF THE R/W -; MEMORY. THIS ALLOWS R.O.M. AT ZERO, -; AND INSURES A CONTINUOUS MEMORY BLOCK -; HAS BEEN FOUND. -; IT IS USED BY THE ERROR ROUTINE TO -; RESET THE STACK POINTER AS WELL. -; -MEMSIZ: PUSH BC -;WW LD BC,BASE ;POINT TO START OF MONITOR -;WW LD HL,-1 ;RAM SEARCH STARTINT PT. -;WW..M0: INC H ;FIRST FIND R/W MEMORY -;WW LD A,(HL) -;WW CPL -;WW LD (HL),A -;WW CP (HL) -;WW CPL -;WW LD (HL),A -;WW JR NZ,..M0 -;WW..M1: INC H ;R/W FOUND, NOW FIND END -;WW LD A,(HL) -;WW CPL -;WW LD (HL),A -;WW CP (HL) -;WW CPL -;WW LD (HL),A -;WW JR NZ,..M2 -;WW LD A,H ;TEST FOR MONITOR BORDER -;WW CP B -;WW JR NZ,..M1 ;NOT THERE YET -;WW..M2: DEC H ;BACK UP, SUBTRACT WORKSPACE - LD HL,$EFFF ; WW - FIXED TOP OF MEMORY AT $F000 - LD BC,EXIT-ENDX - ADD HL,BC - POP BC ;RESTORE BC - RET ;VALUE IN HL -; -; -RIBBLE: CALL RIX -NIBBLE: SUB '0' ;QUALIFY & CONVERT - RET C ;<0 - CP 'G'-'0' ;>F? - CCF ;PERVERT CARRY - RET C - CP 10 ;NMBR? - CCF ;PERVERT AGAIN - RET NC ;RETURN CLEAN - SUB 'A'-'9'-1 ;ADJUST - CP 0AH ;FILTER ":" THRU "@" - RET -; -; SEND H&L VALUE TO PUNCH DEVICE -; -PADR: LD A,H - CALL PBYTE - LD A,L -; -; PUNCH A SINGLE BYTE -; -PBYTE: PUSH AF ;NIBBLE AT A TIME - RRCA - RRCA - RRCA - RRCA - CALL CONV - CALL PUO - POP AF ;NEXT NIBBLE - PUSH AF ;SAVE FOR CHECKSUM - CALL CONV - CALL PUO - POP AF ;ORIGINAL BYTE HERE - ADD D ;ADDED TO CHECKQUM - LD D,A ;UPDATE CHECKSUM - RET -; -; -COPCK: LD C,'-' - CALL CO -; -PCHK: CALL TI -; -; TEST FOR DELIMITERS -; -QCHK: CP ' ' ;RETURN ZERO IF DELIMITER - RET Z - CP ',' - RET Z - CP CR ;RETURN W/CARRY SET IF CR - SCF - RET Z - CCF ;ELSE NON-ZERO, NO CARRY - RET -; -; MAIN CONSOLE INPUT ROUTINE -; -CI: CALL IOCHK - AND ~CMSK ; WW: WAS "NOT CMSK" - JR NZ,CI1 -; -; TELEPRINTER ROUTINE -; -TTYIN: IN A,TTS - AND TTYDA - JR Z,TTYIN - IN A,TTI - RET -; -CI1: DEC A ;CONSOLE=CRT? - JR NZ,CI2 -; -; C.R.T. INPUT ROUTINE -; -CRTIN: IN A,CRTS - AND CRTDA - JR Z,CRTIN - IN A,CRTI - RET -; -CI2: DEC A ;BATCH? - JP NZ,CILOC ;NO, MUST BE USER DEFINED -; -; -; READER INPUT ROUTINE, WITH -; TIME-OUT DELAY. INCLUDES -; PULSING OF HARDWARE PORT -; TO INDICATE REQUEST FOR -; READER DATA. -; -RI: PUSH HL - CALL IOCHK - AND NOT RMSK - ;WW CPL - ;WW OUT RCP,A ;PULSE READER CONTROL PORT - ;WW CPL ;CLEEAR IT - ;WW OUT RCP,A - JR NZ,RI3 ;NOT TTY - LD H,A ;CLEAR FOR-TIME OUT TEST -RI0: IN A,TTS - AND TTYDA - JR NZ,RI2 ; WW: Z -> NZ - PUSH BC - LD B,0 -DL0: EX (SP),HL ;WASTE TIME - EX (SP),HL ;FOR DELAY - DJNZ DL0 - POP BC - DEC H -; JR NZ,RI0 ; WW - JR RI0 ; WW - ELIMINATE TIMEOUT -RI1: XOR A - SCF - POP HL - RET -RI2: IN A,TTI -RID: OR A - POP HL - RET -RI3: CP RCAS - JR NZ,RI6 - ;WW IN A,SWITCH ;READ INITIAL SENSE CONDX. - ;WW LD L,A -RI4: ;WW IN A,SWITCH ;SEE IF SW. ALTERED - ;WW CP L - ;WW JR NZ,RI1 ;ABORT IF SO - IN A,RCSS - AND RCSDA ;DATA YET? - JR NZ,RI4 ;KEEP LOOKING -RI5: IN A,RCSD - JR RID -RI6: POP HL - CP RPTR - JP Z,RPTPL ;EXTERNAL ROUTINE - JP RULOC ;USER VECTOR -; -; THIS ROUTINE GETS READER INPUT -; AND KILLS THE PARITY BIT. -; -RIX: CALL RIFF - AND 7FH - RET -; -; THIS ROUTINE READS A BINARY FILE -; IMAGE, IN THE FORM AS PUNCHED IN -; THE "U" (UNLOAD) COMMAND. IT TAKES -; ONE PARAMETER, WHICH IS THE STARTING -; ADDRESS OF THE LOAD, AND WILL PRINT -; THE LAST ADDRESS (+1) LOADED ON THE -; CONSOLE DEVICE. -; -LOAD: CALL EXPR1 ;INITIAL LOAD ADDRESS - POP HL - CALL CRLF - LD D,0FFH ;START-OF-FILE TAB -...L0: LD B,4 ;FIND AT LEAST FOUR 0FFH'S -...L1: CALL RIFF - JR NZ,...L0 - DJNZ ...L1 -...L2: CALL RIFF ;4 FOUND, NOW WAIT FOR NON-0FFH - JR Z,...L2 - LD (HL),A ;FIRST REAL DATA BYTE - LD A,BELL ;TELL TTY - OUT TTO,A -...L3: INC HL - CALL RIFF - JR Z,..EL ;POSSIBLE END OF FILE - LD (HL),A - JR ...L3 -..EL: LD E,1 ;INITIALIZE -..EL0: CALL RIFF - JR NZ,..EL1 - INC E ;COUNT QUES - LD A,MAX ;LOOK FOR EOF - CP E ;FOUND MAX? - JR NZ,..EL0 ;NOPE - JP LADR ;YEP, PRINT END ADDR -..EL1: LD (HL),D - INC HL - DEC E ;RESTORE - JR NZ,..EL1 - LD (HL),A ;REAL BYTE - JR ...L3 -; -; THIS IS THE BREAKPOINT "TRAP" HANDLING -; ROUTINE. ALL USER REGISTERS ARE SAVED -; FOR DISPLAY PURPOSES, AND THE CONTENTS -; ARE RESTORED WHEN EXECUTING A "GO" (G) -; COMMAND. -; -RESTART: - PUSH HL ;PUSH ALL REGISTERS - PUSH DE - PUSH BC - PUSH AF - CALL MEMSIZ ;GET MONITOR'S STACK VALUE - EX DE,HL - LD HL,10 ;GO UP 10 BYTES IN STACK - ADD HL,SP - LD B,4 ;PICK OFF REG. - EX DE,HL -...R0: DEC HL - LD (HL),D ;SAVE IN WORKAREA - DEC HL - LD (HL),E - POP DE - DJNZ ...R0 - POP BC - DEC BC ;ADJUST P.C. VALUE - LD SP,HL ;SET MONITOR STACK - LD HL,TLOCX - ADD HL,SP - LD A,(HL) - SUB C ;LOOK FOR A TRAP/MATCH - INC HL - JR NZ,..R1 - LD A,(HL) - SUB B - JR Z,..R3 ;NO TRAP HERE -..R1: INC HL - INC HL - LD A,(HL) - SUB C ;TEST FOR SECOND TRAP - JR NZ,..R2 - INC HL - LD A,(HL) - SUB B - JR Z,..R3 -..R2: INC BC ;NO TRAPS SET, RE-ADJUST P.C. -..R3: LD HL,LLOCX - ADD HL,SP - LD (HL),E ;STORE USER H&L - INC HL - LD (HL),D - INC HL - INC HL - LD (HL),C ;AND USER P.C. - INC HL - LD (HL),B - PUSH BC - LD C,'@' ;DISPLAY BREAK ADDRESS. - CALL CO - POP HL - CALL LADR - LD HL,TLOCX - ADD HL,SP - LD BC,200H -..R4: LD E,(HL) ;REPLACE BYTES TAKEN FOR TRAP - LD (HL),C ;ZERO OUT STORAGE AREA - INC HL - LD D,(HL) - LD (HL),C - INC HL - LD A,E - OR D ;DO NOTHING IF ZERO - JR Z,..R5 - LD A,(HL) - LD (DE),A ;STORE BYTE -..R5: INC HL ;SAME THING - DJNZ ..R4 ;FOR OTHER BREAKPOINT - EX AF,AF' ;GET ALTERNATE SET OF REG.'S - EXX - PUSH HL ;AND STORE IN WORKSPACE - PUSH DE - PUSH BC - PUSH AF - PUSH IX - PUSH IY - LD A,I ;GET INTERUPT VECTOR BYTE - LD B,A - LD A,R ;GET REFRESH BYTE - LD C,A - PUSH BC ;SAVE - JP START ;BACK TO START -; -; THIS IS THE INTERNAL KEYBOARD -; HANDLING ROUTINE. IT WILL IGNORE -; RUBOUTS (0FFH) AND BLANKS (00), -; AND IT WILL NOT ECHO CR'S & N'S. -; (NO N'S FOR THE "NULL" COMMAND). -; IT CONVERTS LOWER CASE TO UPPER -; CASE FOR THE LOOK-UP OF COMMANDS. -; -; OTHER CHARACTERS ARE ECHOED AS THEY -; ARE RECEIVED. -; -KI: CALL CI ;GET CHARACTER FROM CONSOLE - AND 7FH ;CLEAR PARITY BIT - RET -; -TI: CALL KI - INC A ;IGNORE RUBOUTS - RET M - DEC A ;IGNORE NULLS - RET Z - CP 'N' ;IGNORE N'S FOR NULL CMND - RET Z - CP 'n' - JR Z,..T - CP CR ;IGNORE CR'S - RET Z - PUSH BC - LD C,A - CALL CO - LD A,C - POP BC - CP 'A'-1 ;CONVERT TO UPPER CASE - RET C - CP 'z'+1 - RET NC -..T: AND 05FH - RET -; -; THIS ROUTINE ALLOWS EXAMINATION OF -; ANY INPUT PORT, OR THE SEENDING OF -; ANY VALUE TO ANY PORT. -; -; QO,[CR] -; OUTPUT TO PORT , THE VALUE -; -; QI[CR] -; DISPLAY THE PORT -; -QUERY: CALL TI - CP 'O' - JR Z,QUO - CP 'I' - JP NZ,ERROR - CALL EXPR1 - POP BC - IN E,(C) -BITS: LD B,8 ;DISPLAY 8 BITS - CALL BLK -..Q2: SLA E - LD A,'0'>>1 ; WW: WAS "LD A,'0' >1" - ADC A ;MAKE "0" OR "1" - LD C,A - CALL CO - DJNZ ..Q2 - RET -QUO: CALL EXPR - POP DE - POP BC - OUT (C),E - RET -; -; THIS ROUTINE VERIFIES THE CONTENTS -; OF ONE MEMORY BLOCK WITH ANOTHER. -; -; V,, -; VERIFY FROM <1> THRU <2> WITH -; THE CONTENTS OF MEMORY BEGINNING AT <3> -; -VERIFY: CALL EXPR3 ;GET 3 PARAMENTERS -VERI0: LD A,(BC) - CP (HL) - JR Z,..B - PUSH BC - CALL CERR ;DISPLAY ERRORS - POP BC -..B: INC BC - CALL HILOX - JR VERI0 -; -; -; -; THE FIRST CHARACTER IS THE DEVICE NAME -; (ONE LETTER) AND THE NEXT FOUR ARE THE -; NAMES OF THE FOUR POSSIBLE DRIVERS TO BE -; ASSIGNED. -; -LTBL: - DB 'C' ;CONSOLE ASSIGNMENTS - DB 'T' ;CTTY T=TELEPRINTER - DB 'C' ;CCRT C=CRT (VIDEO MONITOR) - DB 'B' ;BATCH= COMMANDS FROM READER - DB 'U' ;CUSE USER -; - DB 'R' ;READER ASSIGNMENTS - DB 'T' ;RTTY - DB 'P' ;RPTR P=PAPER TAPE - DB 'C' ;RCAS C=CASSETTE - DB 'U' ;RUSER USER -; - DB 'P' ;PUNCH ASSIGNMENTS - DB 'T' ;PTTY - DB 'P' ;PPTP - DB 'C' ;PCAS C=CASSETTE - DB 'U' ;PUSER USER -; - DB 'L' ;LIST ASSIGNMENTS - DB 'T' ;LTTY LIST=TELEPRINTER - DB 'C' ;LCRT LIST=CRT - DB 'L' ;LINE PRINTER - DB 'U' ;LUSER USER -; -; -; THIS IS A SHORT PROGRAM, EXECUTED -; UPON EXECUTING A "GO" COMMAND. IT -; IS PLACED IN THE WORK AREA WHEN -; THE MONITOR IS INITIALIZED, AS IT -; :REQUIRES RAM FOR PROPER OPERATION. -; -EXIT: ;EXIT ROUTINE (LOADS ALL REGISTERS) - POP BC - LD A,C - LD R,A - LD A,B - LD I,A - POP IY - POP IX - POP AF - POP BC - POP DE - POP HL - EX AF,AF' - EXX - POP DE - POP BC - POP AF - POP HL - LD SP,HL - NOP ;RESERVED FOR ENABLE INTERUPTS - LD HL,0 - JP 0 -; - DW 0 ;STORAGE AREA FOR TRAP DATA - DB 0 - DW 0 - DB 0 -; -; DISPLACEMENTS OF REGISTER -; STORAGE FROM NORMAL STACK -; LOCATION. -; -ENDX: -; -ALOC: EQU 15H -BLOC: EQU 13H -CLOC: EQU 12H -DLOC: EQU 11H -ELOC: EQU 10H -FLOC: EQU 14H -HLOC: EQU 31H -LLOC: EQU 30H -PLOC: EQU 34H -SLOC: EQU 17H -TLOC: EQU 35H -TLOCX: EQU 25H -LLOCX: EQU 20H -; -APLOC: EQU 09H -BPLOC: EQU 0BH -CPLOC: EQU 0AH -DPLOC: EQU 0DH -EPLOC: EQU 0CH -FPLOC: EQU 08H -HPLOC: EQU 0FH -LPLOC: EQU 0EH -XLOC: EQU 07 -YLOC: EQU 05 -RLOC: EQU 02 -ILOC: EQU 03 -; -; -; THIS IS THE TABLE USED TO DETERMINE -; A VALID REGISTER IDENTIFIER, AND IT'S -; DISPLACEMENT FROM THE STACK POINTER. -; -; POSITION ONE= REGISTER NAME, WITH BIT 7 INDICATING -; END OF TABLE. -; -; POSITION TWO= BIAS FROM CURRENT STACK LEVEL OR'ED -; WITH A TWO-BIT FLAG. 00XXXXXX=BYTE -; 10XXXXXX=WORD -; 11XXXXXX=SPECIAL FOR "M" REG. -; -ACTBL: ;NORMAL SET OF REGISTERS (8080) -; ;PLUS THE INTERUPT REGISTER ("I") -; - DB 'A',ALOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'B',BLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'C',CLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'D',DLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'E',ELOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'F',FLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'H',HLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'L',LLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'M',HLOC | 0C0H ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'P',PLOC | 080H ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'S',SLOC | 080H ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'I',ILOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM -; -; DB " RWA" -; -PRMTB: ;ADDITIONAL SET OF REGISTERS (Z-80) -; - DB 'A',APLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'B',BPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'C',CPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'D',DPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'E',EPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'F',FPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'H',HPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'L',LPLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'M',HPLOC | 0C0H ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'X',XLOC | 080H ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'Y',YLOC | 080H ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 'R',RLOC | 0 ; WW: REPLACED "OR" WITH "|" FOR TASM - DB 0C1H -; -Z: -;WW END diff --git a/branches/dgg/cpurom/Makefile b/branches/dgg/cpurom/Makefile deleted file mode 100644 index 9442748f..00000000 --- a/branches/dgg/cpurom/Makefile +++ /dev/null @@ -1,692 +0,0 @@ -######################################################## -# Makefile for Doug's Unified BIOS 8/07/2011 # -# The BIOS and associated utilities are generated # -# using the Small Device C Compiler (SDCC) & tools # -# With multiplatform enhancements by John Coffman # -# # -# sdcc.l00 added because stupid Windoze 'echo' appends # -# a confusing SPACE to the end of every line. # -######################################################## - -##################################################### -# SPREFIX tells where the SDCC package in installed # -# The SDCC package is used to assemble Z80 portions # -# of the software such as the ROM and perhaps some # -# .COM files such as FDISK. # -##################################################### - -################################################################# -# TPREFIX tells where the host development tools are installed. # -# The host tools are used to manipulate the Z80 objects after # -# the basic assemblies and compilations have been completed. # -################################################################# - -################################################################### -# SDCC is not available on the DOS host, so something else may be # -# used at the descretion of the builder. (TASM for instance). # -################################################################### - -################################################################### -# The COPY, DEL and RENAME macros are used to customize the build # -# rules for the host enviroonment. # -################################################################### - -#------------------------------------------- -# Choose one only, then Make will work for -# your platform. - -#CFG = $(shell uname) -# Mac OS X returns 'Darwin' -# Linux returns 'Linux' - -#CFG = dos -#CFG = linux -#CFG = macosx -CFG = windows - -#------------------------------------------- -ifeq ($(CFG),Darwin) -DELIM = / -SPREFIX = /Developer/sdcc -SDAS = $(SPREFIX)/bin/sdasz80 -SDASFLG = -plosff -Iinc -SDCC = $(SPREFIX)/bin/sdcc -SDCCFLG = -c -mz80 -D__SDCC__=1 -I inc -SDCCLIB = $(SPREFIX)/share/sdcc/lib/z80 -SDLD = $(SPREFIX)/bin/sdldz80 -SDLDFLG = -TPREFIX = -TCC = gcc -TCCFLG = -I inc -COPY = cp -DEL = rm -DELFLG = -f -# use native ECHO o Mac OS X -ECHO = echo -REN = mv -EXE = -endif -#------------------------------------------- -ifeq ($(CFG),windows) -DELIM = \ -SDRIVE = C: -SPREFIX = $(SDRIVE)\Program Files (x86)\sdcc -SDAS = $(SPREFIX)\bin\sdasz80 -SDASFLG = -plosff -SDCC = $(SPREFIX)\bin\sdcc -SDCCFLG = -c -mz80 -D__SDCC__=1 -I inc -SDCCLIB = $(SPREFIX)\lib\z80 -SDLD = $(SPREFIX)\bin\sdldz80 -SDLDFLG = -TPREFIX = -TCC = gcc -TCCOPT = -I inc -COPY = copy -DEL = erase -DELFLG = -REN = rename - -# This is special handling for John Coffman to get around funky windows -# behavior where echo adds spurious space o end f line -# ECHO = { lecho | lechocr | lecholf | lechocrlf | lecholfcr } - -#ECHO = $(BIN)$(DELIM)lechocr -#ECHO = $(BIN)$(DELIM)lecho - -EXE = .exe -endif - -#------------------------------------------- -ifeq ($(CFG),Linux) -DELIM = / -SPREFIX = /home/$(USER) -SDAS = $(SPREFIX)/bin/sdasz80 -SDASFLG = -plosff -SDCC = $(SPREFIX)/bin/sdcc -SDCCFLG = -c -mz80 -D__SDCC__=1 -I inc -SDCCLIB = /usr/local/share/sdcc/lib/z80 -SDLD = $(SPREFIX)/bin/sdldz80 -SDLDFLG = -TPREFIX = -TCC = gcc -TCCFLG = -I inc -COPY = cp -DEL = rm -DELFLG = -f -REN = mv -# Use native 'echo' on Linux -ECHO = echo -EXE = -endif -#------------------------------------------- -ifeq ($(CFG),dos) -DELIM = \ -SPREFIX = -SDAS = -SDASFLG = -SDCC = -SDCCFLG = -SDCCLIB = -SDLD = -SDLDFLG = -TPREFIX = -TCC = wcl -TCCOPT = -COPY = copy -DEL = erase -DELFLG = -REN = rename -EXE = .exe -endif -############################################################ - -# Misc other macros - -BIN = bin$(DELIM) -COM = com$(DELIM) -INC = inc$(DELIM) -LIB = lib$(DELIM) -LST = lst$(DELIM) -MAP = map$(DELIM) -OBJ = obj$(DELIM) -REF = ref$(DELIM) -ROM = rom$(DELIM) -SRC = src$(DELIM) -TMP = tmp$(DELIM) - -# CP/M-80 v2.2 Command files written in SDCC -COMFILES = $(COM)copyfile.com $(COM)fdisk.com - -# Components used by CP/M-80 v2.2 Command files -COMRELS = $(OBJ)cpm0.rel $(OBJ)cpmbdos.rel $(OBJ)cprintf.rel - -# Components of ROM image containing CP/M for SBC V2 -CPMRELS = $(OBJ)crt0.rel $(OBJ)dbgmon.rel $(OBJ)bdosb01.rel \ - $(OBJ)ccpb03.rel $(OBJ)cbios.rel - -# Components of ROM image used in test protocols -ROMRELS = $(OBJ)crt0jplp.rel $(OBJ)crt0scrm.rel - -# Components that control hardware in SBC V2 -SBCV2HW = - -# Components that control hardware in the SCSI2IDE -SCSI2IDEHW = $(OBJ)z53c80.rel - -FDISK = $(BIN)fdisk$(EXE) -DWGH2B = $(BIN)dwgh2b$(EXE) -INCFILES = $(INC)cpmbdos.h $(INC)cprintf.h $(INC)portab.h -JRCH2B = $(BIN)jrch2b$(EXE) -LOAD = $(BIN)load$(EXE) -MK = Makefile -#QUIET = @ - -# ROM images for SBC V2 and N8 -ROMFILES = $(ROM)scsiscrm.rom $(ROM)scsijplp.rom $(ROM)scsi2ide.rom $(ROM)baseline.rom $(ROM)n8.rom -SCSI2IDE = $(ROM)scsi2ide.rom - -SYSGEN = $(BIN)sysgen$(EXE) -VERIFY = $(BIN)verify$(EXE) - -# C programs compiled on host system used in build -TOOLS = $(FDISK) $(DWGH2B) $(LOAD) $(JRCH2B) $(SYSGEN) - -# Versions of 'echo' compiled on host system -ETOOLS = $(BIN)lechocr $(BIN)lecholf $(BIN)lechocrlf $(BIN)lecholfcr - -# dribdos.rel is not part of the production set yet -##TEST = dribdos.rel - -############################################################ - -#all: $(ETOOLS) $(TOOLS) $(BINFILES) $(COMFILES) $(CPMFILES) $(ROMFILES) - -#all: $(TEST) $(ROMFILES) $(COMFILES) - -roms: $(ROMFILES) -scsi2ide: $(SCSI2IDE) - -############################################################ - -# A test assembly of DRI source code for BDOS (from SIMH) -dribdos.rel: $(SRC)dribdos.s - $(QUIET)$(SDAS) $(SDASFLG) dribdos.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dribdos.lst $(LST) - -############################################################ -############################################################ - -# Build SCSIJPLP ROM image - -$(ROM)scsijplp.rom: $(OBJ)scsijplp.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsijplp.bin $(ROM)scsijplp.rom - $(QUIET)$(DEL) $(DELFLG) scsijplp.* - -$(OBJ)scsijplp.bin: $(OBJ)scsijplp.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsijplp - -$(OBJ)scsijplp.hex: $(OBJ)scsijplp.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsijplp.ihx $(OBJ)scsijplp.hex - -$(OBJ)scsijplp.ihx: $(OBJ)crt0jplp.rel $(TMP)scsijplp.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsijplp.arf $(TMP)scsijplp.lk - $(QUIET)$(COPY) $(TMP)scsijplp.arf $(TMP)scsijplp.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsijplp.lnk - $(QUIET)$(COPY) $(COPYFLG) scsijplp.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsijplp.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsi2ide # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsijplp.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsijplp.arf - $(ECHO) -i scsijplp.ihx >> $(TMP)scsijplp.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsijplp.arf - $(ECHO) -l z80 >> $(TMP)scsijplp.arf - $(ECHO) $(OBJ)crt0jplp.rel >> $(TMP)scsijplp.arf - $(ECHO) -e >> $(TMP)scsijplp.arf - -############################################################ -############################################################ - -# Build SCSISCRM ROM image - -$(ROM)scsiscrm.rom: $(OBJ)scsiscrm.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsiscrm.bin $(ROM)scsiscrm.rom - $(QUIET)$(DEL) $(DELFLG) scsiscrm.* - -$(OBJ)scsiscrm.bin: $(OBJ)scsiscrm.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsiscrm - -$(OBJ)scsiscrm.hex: $(OBJ)scsiscrm.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsiscrm.ihx $(OBJ)scsiscrm.hex - -$(OBJ)scsiscrm.ihx: $(OBJ)crt0scrm.rel $(TMP)scsiscrm.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsiscrm.arf $(TMP)scsiscrm.lk - $(QUIET)$(COPY) $(TMP)scsiscrm.arf $(TMP)scsiscrm.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsiscrm.lnk - $(QUIET)$(COPY) $(COPYFLG) scsiscrm.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsiscrm.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsiscrm # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsiscrm.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsiscrm.arf - $(ECHO) -i scsiscrm.ihx >> $(TMP)scsiscrm.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsiscrm.arf - $(ECHO) -l z80 >> $(TMP)scsiscrm.arf - $(ECHO) $(OBJ)crt0scrm.rel >> $(TMP)scsiscrm.arf - $(ECHO) -e >> $(TMP)scsiscrm.arf - -############################################################ -############################################################ - -# Build SCSI2IDE ROM image - -$(ROM)scsi2ide.rom: $(OBJ)scsi2ide.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsi2ide.bin $(ROM)scsi2ide.rom - $(QUIET)$(DEL) $(DELFLG) scsi2ide.* - -$(OBJ)scsi2ide.bin: $(OBJ)scsi2ide.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsi2ide - -$(OBJ)scsi2ide.hex: $(OBJ)scsi2ide.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsi2ide.ihx $(OBJ)scsi2ide.hex - -$(OBJ)scsi2ide.ihx: $(CPMRELS) $(SCSI2IDEHW) $(OBJ)scsi2ide.rel $(TMP)scsi2ide.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsi2ide.arf $(TMP)scsi2ide.lk - $(QUIET)$(COPY) $(TMP)scsi2ide.arf $(TMP)scsi2ide.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsi2ide.lnk - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsi2ide # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsi2ide.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsi2ide.arf - $(ECHO) -i scsi2ide.ihx >> $(TMP)scsi2ide.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsi2ide.arf - $(ECHO) -l z80 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _CCPB03 = 0xD000 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _BDOSB01 = 0xD800 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _CBIOS = 0xE600 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _DBGMON = 0x8000 >> $(TMP)scsi2ide.arf - $(ECHO) $(OBJ)crt0.rel >> $(TMP)scsi2ide.arf - $(ECHO) $(OBJ)scsi2ide.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)cbios.rel >> $(TMP)scsi2ide.arf - $(ECHO) -e >> $(TMP)scsi2ide.arf - -######################################################## -# Compile C portion of the scsi2ide EEPROM Image -$(OBJ)scsi2ide.rel: $(SRC)scsi2ide.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) -c $(SRC)scsi2ide.c - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.lst $(LST) - - -############################################################ -############################################################ - -# Build SBC V2 ROM image - -$(ROM)baseline.rom: $(OBJ)baseline.bin $(MK) - $(QUIET)$(COPY) $(OBJ)baseline.bin $(ROM)baseline.rom - $(QUIET)$(DEL) $(DELFLG) baseline.* - -$(OBJ)baseline.bin: $(OBJ)baseline.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)baseline - -$(OBJ)baseline.hex: $(OBJ)baseline.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)baseline.ihx $(OBJ)baseline.hex - -$(OBJ)baseline.ihx: $(CPMRELS) $(SBCV2HW) $(OBJ)baseline.rel $(TMP)baseline.arf $(MK) - $(QUIET)$(COPY) $(TMP)baseline.arf $(TMP)baseline.lk - $(QUIET)$(COPY) $(TMP)baseline.arf $(TMP)baseline.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)baseline.lnk - $(QUIET)$(COPY) $(COPYFLG) baseline.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) baseline.map $(MAP) - -######################################################### -# Dynamically generate linker control file for baseline # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)baseline.arf: $(MK) - $(ECHO) -mjx > $(TMP)baseline.arf - $(ECHO) -i baseline.ihx >> $(TMP)baseline.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)baseline.arf - $(ECHO) -l z80 >> $(TMP)baseline.arf - $(ECHO) -b _CCPB03 = 0xD000 >> $(TMP)baseline.arf - $(ECHO) -b _BDOSB01 = 0xD800 >> $(TMP)baseline.arf - $(ECHO) -b _CBIOS = 0xE600 >> $(TMP)baseline.arf - $(ECHO) -b _DBGMON = 0x8000 >> $(TMP)baseline.arf - $(ECHO) $(OBJ)crt0.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)baseline.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)cbios.rel >> $(TMP)baseline.arf - $(ECHO) -e >> $(TMP)baseline.arf - -######################################################## -# Compile C portion of the Baseline PROM Image -$(OBJ)baseline.rel: $(SRC)baseline.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) -c $(SRC)baseline.c - $(QUIET)$(COPY) $(COPYFLG) baseline.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) baseline.lst $(LST) - -############################################################ - -# Build N8 ROM image - -# -# Save the resulting merged image in the Rom folder -# -$(ROM)n8.rom: $(OBJ)n8-romim.bin $(MK) - $(QUIET)$(COPY) $(OBJ)n8-romim.bin $(ROM)n8.rom - $(QUIET)$(DEL) $(DELFLG) n8.* - -# -# Convert the Intel hex file into a binary, similar -# to the results of the "copy /B ..." -# -$(OBJ)n8-romim.bin: $(OBJ)sysimage.hex $(REF)n8-romim.ref $(SYSGEN) $(HEX2BIN) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)sysimage - $(QUIET)$(COPY) $(REF)n8-romim.ref $(OBJ)n8-romim.bin - $(QUIET)$(SYSGEN) -i $(OBJ)sysimage.bin $(OBJ)n8-romim.bin - -# -# Take the output of the linker and rename to the more -# recognizable .hex form and the expected name "sysimage.hex" -# -$(OBJ)sysimage.hex: $(OBJ)n8.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)n8.ihx $(OBJ)sysimage.hex - -# -# Combine the independently assembled components into one piece -# and output Intel hex file (ihx) -# -$(OBJ)n8.ihx: $(OBJ)loadern8.rel $(OBJ)dbgmon.rel $(OBJ)ccpb03.rel $(OBJ)bdosb01.rel $(OBJ)cbiosn8.rel $(TMP)n8.arf $(MK) - $(QUIET)$(COPY) $(TMP)n8.arf $(TMP)n8.lk - $(QUIET)$(COPY) $(TMP)n8.arf $(TMP)n8.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)n8.lnk - $(QUIET)$(COPY) $(COPYFLG) n8.ihx $(OBJ)n8.ihx - $(QUIET)$(COPY) $(COPYFLG) n8.map $(MAP) - -$(OBJ)cbiosn8.rel: $(SRC)cbiosn8.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cbiosn8.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbiosn8.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbiosn8.lst $(LST) - -$(OBJ)loadern8.rel: $(SRC)loadern8.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)loadern8.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)loadern8.rel $(OBJ) - $(QUIET)$(COPY $(COPYFLG) $(SRC)loadern8.lst $(LST) - -######################################################## -# Dynamically generate the linker control file for N8 # -# Now uses the macro controlled ECHO feature # -######################################################## -$(TMP)n8.arf: Makefile - $(ECHO) -mjx > $(TMP)n8.arf - $(ECHO) -i n8.ihx >> $(TMP)n8.arf - $(ECHO) -k /usr/local/share/sdcc/lib/z80 >> $(TMP)n8.arf - $(ECHO) -l z80 >> $(TMP)n8.arf - $(ECHO) -b _CCPB03 = 0x0900 >> $(TMP)n8.arf - $(ECHO) -b _BDOSB01 = 0x1100 >> $(TMP)n8.arf - $(ECHO) -b _CBIOS = 0x1f00 >> $(TMP)n8.arf - $(ECHO) $(OBJ)loadern8.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)cbiosn8.rel >> $(TMP)n8.arf - $(ECHO) -e >> $(TMP)n8.arf - -############################################################ - -# Hardware specific assemblies (most likely used by BIOS's) - -# -# Assemble hardware control code for the Zilog Z53C8003V5C -# -$(OBJ)z53c80.rel: $(SRC)z53c80.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)z53c80.c - $(QUIET)$(COPY) $(COPYFLG) z53c80.rel $(OBJ) - $(QUIET)$(DEL) $(DELFLG) z53c80.* - -# -# Compile ersatz printf routine for use in CP/M-80 command files -# -$(OBJ)cprintf.rel: $(SRC)cprintf.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)cprintf.c - $(QUIET)$(COPY) $(COPYFLG) cprintf.rel obj - $(QUIET)$(DEL) $(DELFLG) cprintf.* - -############################################################ - -# Build CP/M 2.2 command files (copyfile.com, fdisk.com) - -#----------------------------------------------------------- - -$(COM)copyfile.com: $(OBJ)copyfile.com $(MK) - $(QUIET)$(COPY) $(OBJ)copyfile.com $(COM)copyfile.com - $(QUIET)$(DEL) $(DELFLG) copyfile.* - -$(OBJ)copyfile.com: $(OBJ)copyfile.hex $(LOAD) $(BINFILES) $(MK) - $(QUIET)$(LOAD) $(OBJ)copyfile - -$(OBJ)copyfile.hex: $(OBJ)copyfile.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)copyfile.ihx $(OBJ)copyfile.hex - -$(OBJ)copyfile.ihx: $(OBJ)copyfile.rel $(COMRELS) $(TMP)copyfile.arf $(MK) - $(QUIET)$(COPY) $(TMP)copyfile.arf $(TMP)copyfile.lnk - - $(QUIET)$(SDLD) $(LOPTS) -nf $(TMP)copyfile.lnk - $(QUIET)$(COPY) $(COPYFLG) copyfile.ihx obj - $(QUIET)$(COPY) $(COPYFLG) copyfile.map map - -############################################################## -# Dynamicaly create linker command file for copyfile utility # -# Now uses the macro controlled ECHO feature # -############################################################## -$(TMP)copyfile.arf: Makefile - $(ECHO) -mjx > $(TMP)copyfile.arf - $(ECHO) -i copyfile.ihx >> $(TMP)copyfile.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)copyfile.arf - $(ECHO) -l z80 >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cpm0.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)copyfile.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cpmbdos.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cprintf.rel >> $(TMP)copyfile.arf - $(ECHO) -e >> $(TMP)copyfile.arf - -$(OBJ)copyfile.rel: $(SRC)copyfile.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)copyfile.c - $(QUIET)$(COPY) copyfile.rel obj - $(QUIET)$(DEL) $(DELFLG) copyfile.rel - ls obj - -#----------------------------------------------------------- - -# -# Use locally compiled 'load' command to covert Intel -# hex formal file to a binary CP/M-80 command file. -# -$(COM)fdisk.com: $(OBJ)fdisk.hex $(TOOLS) $(MK) - $(QUIET)$(BIN)load $(OBJ)fdisk - $(QUIET)$(COPY) $(COPYFLG) $(OBJ)fdisk.com com - $(QUIET)$(DEL) $(DELFLG) fdisk.* - -# -# rename 'ihx' output of linker to 'hex' - -$(OBJ)fdisk.hex: $(OBJ)fdisk.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)fdisk.ihx $(OBJ)fdisk.hex - -$(OBJ)fdisk.ihx: $(OBJ)fdisk.rel $(TMP)fdisk.arf $(MK) - $(QUIET)$(COPY) $(TMP)fdisk.arf $(TMP)fdisk.lnk - $(QUIET)$(COPY) $(TMP)fdisk.arf $(TMP)fdisk.lk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)fdisk.lnk - $(QUIET)$(COPY) $(COPYFLG) fdisk.ihx $(OBJ)fdisk.ihx - $(QUIET)$(COPY) $(COPYFLG) fdisk.map map - -$(OBJ)fdisk.rel: $(SRC)fdisk.c $(INCFILES) $(MK) - $(QUIET)$(SDCC) -I inc $(SDCCFLG) $(SRC)fdisk.c - $(QUIET)$(COPY) $(COPYFLG) fdisk.rel $(OBJ) - -############################################################################ -# Dynamically created linker command file for fdisk utility (CP/M version) # -# Now uses macro controlled ECHO feature # -############################################################################ -$(TMP)fdisk.arf: $(MK) - $(ECHO) -mjx > $(TMP)fdisk.arf - $(ECHO) -i fdisk.ihx >> $(TMP)fdisk.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)fdisk.arf - $(ECHO) -l z80 >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cpm0.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)fdisk.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cpmbdos.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cprintf.rel >> $(TMP)fdisk.arf - $(ECHO) -e >> $(TMP)fdisk.arf - - -#----------------------------------------------------------- - -# Also build host version of fdisk for testing purposes - -$(BIN)fdisk$(EXE): $(SRC)fdisk.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)fdisk.c -o $(BIN)fdisk - -############################################################ - -# Build CP/M-80 Command File Structure Files - -$(OBJ)cpm0.rel: $(SRC)cpm0.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cpm0.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpm0.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpm0.lst $(LST) - -$(OBJ)cpmbdos.rel: $(SRC)cpmbdos.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cpmbdos.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpmbdos.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpmbdos.lst $(LST) - -############################################################ - -# Build ROM Image structure files - -$(OBJ)crt0.rel: $(SRC)crt0.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0.lst $(LST) - -$(OBJ)crt0jplp.rel: $(SRC)crt0jplp.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0jplp.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0jplp.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0jplp.lst $(LST) - -$(OBJ)crt0scrm.rel: $(SRC)crt0scrm.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0scrm.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0scrm.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0scrm.lst $(LST) - -$(OBJ)bdosb01.rel: $(SRC)bdosb01.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)bdosb01.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)bdosb01.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)bdosb01.lst $(LST) - -$(OBJ)ccpb03.rel: $(SRC)ccpb03.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)ccpb03.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)ccpb03.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)ccpb03.lst $(LST) - -# -# Assemble hardware control code for SBC V2 -# -$(OBJ)cbios.rel: $(SRC)cbios.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cbios.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbios.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbios.lst $(LST) - -# -# Assemble a monitor program for the SBC V2 -# -$(OBJ)dbgmon.rel: $(SRC)dbgmon.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)dbgmon.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dbgmon.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dbgmon.lst $(LST) - -########################################################### - -# Build host based tools ( dwgh2b, jrch2b, load, verify) - -$(DWGH2B): $(SRC)dwgh2b.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)dwgh2b.c -o $(BIN)dwgh2b$(EXE) - -# -# Compile John Coffman's hex2bin program -# -$(JRCH2B): $(SRC)jrch2b.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)jrch2b.c -o $(BIN)jrch2b$(EXE) - $(QUIET)$(COPY) $(COPYFLG) $(BIN)jrch2b $(BIN)jrcb2h - -# -# Compile Doug's "load" program -# -$(LOAD): $(SRC)load.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)load.c -o $(BIN)load$(EXE) - -$(SYSGEN): $(SRC)sysgen.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)sysgen.c -o $(BIN)sysgen$(EXE) - -# -# Compile Doug's verif program that compares binary file regions -# -$(VERIFY): $(SRC)verify.c Makefile $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)verify.c -o $(BIN)verify - -$(BIN)lechocr: $(SRC)lechocr.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lechocr.c -o $(BIN)lechocr - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lechocr.c - $(QUIET)$(COPY) lechocr.exe $(BIN) - -$(BIN)lecholf: $(SRC)lecholf.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholf.c -o $(BIN)lecholf - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholf.c - $(COPY) lecholf.exe $(BIN) - -$(BIN)lechocrlf: $(SRC)lechocrlf.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lechocrlf.c -o $(BIN)lechocrlf - -$(BIN)lecholfcr: $(SRC)lecholfcr.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholfcr.c -o $(BIN)lecholfcr - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholfcr.c -o $(BIN)lecholfcr - -############################################################ - -# Builder specific utility rules - -dwginstall: - $(COPY) $(COMFILES) ~/Documents/devobox/cdrive - -############################################################ - -# -# Delete all dynamically generated files that don't need to be -# saved. -# -clean: - $(QUIET)$(DEL) $(DELFLG) *.hex *.ihx *.lst *.rel *.rst *.lnk *.lk - $(QUIET)$(DEL) $(DELFLG) *.sym *.map *.noi *.asm *.com *.ini *.bin - $(QUIET)$(DEL) $(DELFLG) obj/* bin/* com/* rom/* tmp/* map/* lst/* - -################## -# eof - Makefile # -################## diff --git a/branches/dgg/cpurom/cleanxp.bat b/branches/dgg/cpurom/cleanxp.bat deleted file mode 100644 index b6be7814..00000000 --- a/branches/dgg/cpurom/cleanxp.bat +++ /dev/null @@ -1 +0,0 @@ -wmake -f makefile.xp clean diff --git a/branches/dgg/cpurom/doc/agm1264f.pdf b/branches/dgg/cpurom/doc/agm1264f.pdf deleted file mode 100644 index 60eec3d9..00000000 Binary files a/branches/dgg/cpurom/doc/agm1264f.pdf and /dev/null differ diff --git a/branches/dgg/cpurom/doc/bdoscalls.webarchive b/branches/dgg/cpurom/doc/bdoscalls.webarchive deleted file mode 100644 index 30b4faad..00000000 Binary files a/branches/dgg/cpurom/doc/bdoscalls.webarchive and /dev/null differ diff --git a/branches/dgg/cpurom/doc/bios.webarchive b/branches/dgg/cpurom/doc/bios.webarchive deleted file mode 100644 index ede74cc5..00000000 Binary files a/branches/dgg/cpurom/doc/bios.webarchive and /dev/null differ diff --git a/branches/dgg/cpurom/doc/fcb.webarchive b/branches/dgg/cpurom/doc/fcb.webarchive deleted file mode 100644 index d8468620..00000000 Binary files a/branches/dgg/cpurom/doc/fcb.webarchive and /dev/null differ diff --git a/branches/dgg/cpurom/doc/jrch2b.doc b/branches/dgg/cpurom/doc/jrch2b.doc deleted file mode 100644 index 6231b4db..00000000 --- a/branches/dgg/cpurom/doc/jrch2b.doc +++ /dev/null @@ -1,92 +0,0 @@ -Usage: - hex2bin [ ]+ - bin2hex - - Options: - -o -- default is 'out.bin' or 'out.hex' - No suffix is added to the filename, so the full - file name must be specified. - - -p -- default is 0xFF, which is the erased - value for most ROM's. Pad bytes are not explicitly - written out when 'bin2hex' is used. This reduces - the size of sparse ROM images. - - -R -- may be any value. Normally this will be - specified as '128k' or 0x10000. The suffixes 'k' - and 'M' are recognized. The default value is 64k - for 'hex2bin' and 1M for 'bin2hex'. - - -v [] -- used primarily for debugging. A - verbosity level of 3 will print each line as it is - processed. - - Options are global, and may be specified anywhere on the command - line. Only 'flags', below, are position sensitive. Flags must - be specified immediately before the file name they are to affect. - They do not affect more that a single file. They reset to their - default values before the next input file, scanning left to - right, is processed. - - Flags: - Flag values apply only to the following file, and are reset - to the default values before the next file is processed. The - source and destination flags allow code to be relocated - within the ROM so that code may be loaded at a different - location than where it will ultimately be run. - - -d -- default is 0. - data will only be loaded between the limits of - the -d address and the -D address - minus 1. - - -D -- default is 16M. No data - will be loaded at or above this address. - - -s -- default is 0. Hex input - is only processed if it falls at addresses in the - .hex input file between the -s address and the - -S address minus 1. Likewise, Bin input - is only processed if it falls between similar limits - in the input ROM image. - - -S -- default is 16M. No input - data at or above this address will be processed. - - Numeric values on the command line may be specified in any C-like - syntax: 0x0000 is hexadecimal, 1234 is decimal, and 0177 is - octal. In addition the suffixes 'k' for kilo- and 'M' for mega- - cause the preceding values to be multiplied by 1024 or 1048576, - respectively. - - Examples: - hex2bin -p 0xFF -R32k cpm22.hex -o cpmtest.bin - hex2bin -o cpmtest.bin cpm22.hex -R 0x8000 -p255 - - The preceding two lines have identical effects in all - respects. - - hex2bin -R 1M -s 0xd000 -d 0x0800 -D0x2800 image.hex \ - pagezero.hex -oROMIMAGE.bin - - The above line loads the 'pagezero.hex' file at the exact - addresses specified in the file; however, the 'image.hex' file - is assembled at 0xD000, must run at 0xD000, but is loaded - between 0x800 <= addr < 0x2800. It is presumed that the - code will be relocated to the correct address before it is - executed. - - bin2hex -R128k romimage.bin -o image.hex - - Simple conversion from a BIN file to a HEX file. The ROM - data is limited to 128k. - - bin2hex -s 0x1000 -S 0x2000 -d 0x21000 romimage.bin \ - -o Relocated.hex - - Extract from a ROM image file all of the data between 0x1000 - and 0x1FFF, inclusive, and write to an Intel hex file for - re-loading two 64k segments higher in a future ROM. - - -(end) diff --git a/branches/dgg/cpurom/doc/make.pdf b/branches/dgg/cpurom/doc/make.pdf deleted file mode 100644 index 3e18161c..00000000 Binary files a/branches/dgg/cpurom/doc/make.pdf and /dev/null differ diff --git a/branches/dgg/cpurom/doc/sdcc-z80-mode.png b/branches/dgg/cpurom/doc/sdcc-z80-mode.png deleted file mode 100644 index 064b32b1..00000000 Binary files a/branches/dgg/cpurom/doc/sdcc-z80-mode.png and /dev/null differ diff --git a/branches/dgg/cpurom/doc/watcom-tools.pdf b/branches/dgg/cpurom/doc/watcom-tools.pdf deleted file mode 100644 index 6d3f38c9..00000000 Binary files a/branches/dgg/cpurom/doc/watcom-tools.pdf and /dev/null differ diff --git a/branches/dgg/cpurom/exp/common.mak b/branches/dgg/cpurom/exp/common.mak deleted file mode 100644 index 7430e334..00000000 --- a/branches/dgg/cpurom/exp/common.mak +++ /dev/null @@ -1,558 +0,0 @@ -# mak/makebody.mfi 8/8/2011 dwg - - -# Misc other macros - -BIN = bin$(DELIM) -COM = com$(DELIM) -INC = inc$(DELIM) -LIB = lib$(DELIM) -LST = lst$(DELIM) -MAP = map$(DELIM) -OBJ = obj$(DELIM) -REF = ref$(DELIM) -ROM = rom$(DELIM) -SRC = src$(DELIM) -TMP = tmp$(DELIM) - -# CP/M-80 v2.2 Command files written in SDCC -COMFILES = $(COM)copyfile.com $(COM)fdisk.com - -# Components used by CP/M-80 v2.2 Command files -COMRELS = $(OBJ)cpm0.rel $(OBJ)cpmbdos.rel $(OBJ)cprintf.rel - -# Components of ROM image containing CP/M for SBC V2 -CPMRELS = $(OBJ)crt0.rel $(OBJ)dbgmon.rel $(OBJ)bdosb01.rel \ - $(OBJ)ccpb03.rel $(OBJ)cbios.rel - -# Components of ROM image used in test protocols -ROMRELS = $(OBJ)crt0jplp.rel $(OBJ)crt0scrm.rel - -# Components that control hardware in SBC V2 -SBCV2HW = - -# Components that control hardware in the SCSI2IDE -SCSI2IDEHW = $(OBJ)z53c80.rel - -FDISK = $(BIN)fdisk$(EXE) -DWGH2B = $(BIN)dwgh2b$(EXE) -INCFILES = $(INC)cpmbdos.h $(INC)cprintf.h $(INC)portab.h -JRCH2B = $(BIN)jrch2b$(EXE) -LOAD = $(BIN)load$(EXE) -MK = Makefile -#QUIET = @ - -# ROM images for SBC V2 and N8 -ROMFILES = $(ROM)scsiscrm.rom $(ROM)scsijplp.rom $(ROM)scsi2ide.rom $(ROM)baseline.rom $(ROM)n8.rom -SCSI2IDE = $(ROM)scsi2ide.rom - -SYSGEN = $(BIN)sysgen$(EXE) -VERIFY = $(BIN)verify$(EXE) - -# C programs compiled on host system used in build -TOOLS = $(FDISK) $(DWGH2B) $(LOAD) $(JRCH2B) $(SYSGEN) - -# Versions of 'echo' compiled on host system -ETOOLS = $(BIN)lechocr $(BIN)lecholf $(BIN)lechocrlf $(BIN)lecholfcr - -# dribdos.rel is not part of the production set yet -##TEST = dribdos.rel - -############################################################ - -#all: $(ETOOLS) $(TOOLS) $(BINFILES) $(COMFILES) $(CPMFILES) $(ROMFILES) - -#all: $(TEST) $(ROMFILES) $(COMFILES) - -roms: $(ROMFILES) -scsi2ide: $(SCSI2IDE) - -############################################################ - -# A test assembly of DRI source code for BDOS (from SIMH) -dribdos.rel: $(SRC)dribdos.s - $(QUIET)$(SDAS) $(SDASFLG) dribdos.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dribdos.lst $(LST) - -############################################################ -############################################################ - -# Build SCSIJPLP ROM image - -$(ROM)scsijplp.rom: $(OBJ)scsijplp.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsijplp.bin $(ROM)scsijplp.rom - $(QUIET)$(DEL) $(DELFLG) scsijplp.* - -$(OBJ)scsijplp.bin: $(OBJ)scsijplp.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsijplp - -$(OBJ)scsijplp.hex: $(OBJ)scsijplp.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsijplp.ihx $(OBJ)scsijplp.hex - -$(OBJ)scsijplp.ihx: $(OBJ)crt0jplp.rel $(TMP)scsijplp.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsijplp.arf $(TMP)scsijplp.lk - $(QUIET)$(COPY) $(TMP)scsijplp.arf $(TMP)scsijplp.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsijplp.lnk - $(QUIET)$(COPY) $(COPYFLG) scsijplp.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsijplp.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsi2ide # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsijplp.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsijplp.arf - $(ECHO) -i scsijplp.ihx >> $(TMP)scsijplp.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsijplp.arf - $(ECHO) -l z80 >> $(TMP)scsijplp.arf - $(ECHO) $(OBJ)crt0jplp.rel >> $(TMP)scsijplp.arf - $(ECHO) -e >> $(TMP)scsijplp.arf - -############################################################ -############################################################ - -# Build SCSISCRM ROM image - -$(ROM)scsiscrm.rom: $(OBJ)scsiscrm.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsiscrm.bin $(ROM)scsiscrm.rom - $(QUIET)$(DEL) $(DELFLG) scsiscrm.* - -$(OBJ)scsiscrm.bin: $(OBJ)scsiscrm.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsiscrm - -$(OBJ)scsiscrm.hex: $(OBJ)scsiscrm.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsiscrm.ihx $(OBJ)scsiscrm.hex - -$(OBJ)scsiscrm.ihx: $(OBJ)crt0scrm.rel $(TMP)scsiscrm.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsiscrm.arf $(TMP)scsiscrm.lk - $(QUIET)$(COPY) $(TMP)scsiscrm.arf $(TMP)scsiscrm.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsiscrm.lnk - $(QUIET)$(COPY) $(COPYFLG) scsiscrm.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsiscrm.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsiscrm # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsiscrm.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsiscrm.arf - $(ECHO) -i scsiscrm.ihx >> $(TMP)scsiscrm.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsiscrm.arf - $(ECHO) -l z80 >> $(TMP)scsiscrm.arf - $(ECHO) $(OBJ)crt0scrm.rel >> $(TMP)scsiscrm.arf - $(ECHO) -e >> $(TMP)scsiscrm.arf - -############################################################ -############################################################ - -# Build SCSI2IDE ROM image - -$(ROM)scsi2ide.rom: $(OBJ)scsi2ide.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsi2ide.bin $(ROM)scsi2ide.rom - $(QUIET)$(DEL) $(DELFLG) scsi2ide.* - -$(OBJ)scsi2ide.bin: $(OBJ)scsi2ide.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsi2ide - -$(OBJ)scsi2ide.hex: $(OBJ)scsi2ide.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsi2ide.ihx $(OBJ)scsi2ide.hex - -$(OBJ)scsi2ide.ihx: $(CPMRELS) $(SCSI2IDEHW) $(OBJ)scsi2ide.rel $(TMP)scsi2ide.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsi2ide.arf $(TMP)scsi2ide.lk - $(QUIET)$(COPY) $(TMP)scsi2ide.arf $(TMP)scsi2ide.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsi2ide.lnk - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsi2ide # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsi2ide.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsi2ide.arf - $(ECHO) -i scsi2ide.ihx >> $(TMP)scsi2ide.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsi2ide.arf - $(ECHO) -l z80 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _CCPB03 = 0xD000 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _BDOSB01 = 0xD800 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _CBIOS = 0xE600 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _DBGMON = 0x8000 >> $(TMP)scsi2ide.arf - $(ECHO) $(OBJ)crt0.rel >> $(TMP)scsi2ide.arf - $(ECHO) $(OBJ)scsi2ide.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)cbios.rel >> $(TMP)scsi2ide.arf - $(ECHO) -e >> $(TMP)scsi2ide.arf - -######################################################## -# Compile C portion of the scsi2ide EEPROM Image -$(OBJ)scsi2ide.rel: $(SRC)scsi2ide.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) -c $(SRC)scsi2ide.c - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.lst $(LST) - - -############################################################ -############################################################ - -# Build SBC V2 ROM image - -$(ROM)baseline.rom: $(OBJ)baseline.bin $(MK) - $(QUIET)$(COPY) $(OBJ)baseline.bin $(ROM)baseline.rom - $(QUIET)$(DEL) $(DELFLG) baseline.* - -$(OBJ)baseline.bin: $(OBJ)baseline.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)baseline - -$(OBJ)baseline.hex: $(OBJ)baseline.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)baseline.ihx $(OBJ)baseline.hex - -$(OBJ)baseline.ihx: $(CPMRELS) $(SBCV2HW) $(OBJ)baseline.rel $(TMP)baseline.arf $(MK) - $(QUIET)$(COPY) $(TMP)baseline.arf $(TMP)baseline.lk - $(QUIET)$(COPY) $(TMP)baseline.arf $(TMP)baseline.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)baseline.lnk - $(QUIET)$(COPY) $(COPYFLG) baseline.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) baseline.map $(MAP) - -######################################################### -# Dynamically generate linker control file for baseline # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)baseline.arf: $(MK) - $(ECHO) -mjx > $(TMP)baseline.arf - $(ECHO) -i baseline.ihx >> $(TMP)baseline.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)baseline.arf - $(ECHO) -l z80 >> $(TMP)baseline.arf - $(ECHO) -b _CCPB03 = 0xD000 >> $(TMP)baseline.arf - $(ECHO) -b _BDOSB01 = 0xD800 >> $(TMP)baseline.arf - $(ECHO) -b _CBIOS = 0xE600 >> $(TMP)baseline.arf - $(ECHO) -b _DBGMON = 0x8000 >> $(TMP)baseline.arf - $(ECHO) $(OBJ)crt0.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)baseline.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)cbios.rel >> $(TMP)baseline.arf - $(ECHO) -e >> $(TMP)baseline.arf - -######################################################## -# Compile C portion of the Baseline PROM Image -$(OBJ)baseline.rel: $(SRC)baseline.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) -c $(SRC)baseline.c - $(QUIET)$(COPY) $(COPYFLG) baseline.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) baseline.lst $(LST) - -############################################################ - -# Build N8 ROM image - -# -# Save the resulting merged image in the Rom folder -# -$(ROM)n8.rom: $(OBJ)n8-romim.bin $(MK) - $(QUIET)$(COPY) $(OBJ)n8-romim.bin $(ROM)n8.rom - $(QUIET)$(DEL) $(DELFLG) n8.* - -# -# Convert the Intel hex file into a binary, similar -# to the results of the "copy /B ..." -# -$(OBJ)n8-romim.bin: $(OBJ)sysimage.hex $(REF)n8-romim.ref $(SYSGEN) $(HEX2BIN) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)sysimage - $(QUIET)$(COPY) $(REF)n8-romim.ref $(OBJ)n8-romim.bin - $(QUIET)$(SYSGEN) -i $(OBJ)sysimage.bin $(OBJ)n8-romim.bin - -# -# Take the output of the linker and rename to the more -# recognizable .hex form and the expected name "sysimage.hex" -# -$(OBJ)sysimage.hex: $(OBJ)n8.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)n8.ihx $(OBJ)sysimage.hex - -# -# Combine the independently assembled components into one piece -# and output Intel hex file (ihx) -# -$(OBJ)n8.ihx: $(OBJ)loadern8.rel $(OBJ)dbgmon.rel $(OBJ)ccpb03.rel $(OBJ)bdosb01.rel $(OBJ)cbiosn8.rel $(TMP)n8.arf $(MK) - $(QUIET)$(COPY) $(TMP)n8.arf $(TMP)n8.lk - $(QUIET)$(COPY) $(TMP)n8.arf $(TMP)n8.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)n8.lnk - $(QUIET)$(COPY) $(COPYFLG) n8.ihx $(OBJ)n8.ihx - $(QUIET)$(COPY) $(COPYFLG) n8.map $(MAP) - -$(OBJ)cbiosn8.rel: $(SRC)cbiosn8.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cbiosn8.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbiosn8.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbiosn8.lst $(LST) - -$(OBJ)loadern8.rel: $(SRC)loadern8.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)loadern8.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)loadern8.rel $(OBJ) - $(QUIET)$(COPY $(COPYFLG) $(SRC)loadern8.lst $(LST) - -######################################################## -# Dynamically generate the linker control file for N8 # -# Now uses the macro controlled ECHO feature # -######################################################## -$(TMP)n8.arf: Makefile - $(ECHO) -mjx > $(TMP)n8.arf - $(ECHO) -i n8.ihx >> $(TMP)n8.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)n8.arf - $(ECHO) -l z80 >> $(TMP)n8.arf - $(ECHO) -b _CCPB03 = 0x0900 >> $(TMP)n8.arf - $(ECHO) -b _BDOSB01 = 0x1100 >> $(TMP)n8.arf - $(ECHO) -b _CBIOS = 0x1f00 >> $(TMP)n8.arf - $(ECHO) $(OBJ)loadern8.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)cbiosn8.rel >> $(TMP)n8.arf - $(ECHO) -e >> $(TMP)n8.arf - -############################################################ - -# Hardware specific assemblies (most likely used by BIOS's) - -# -# Assemble hardware control code for the Zilog Z53C8003V5C -# -$(OBJ)z53c80.rel: $(SRC)z53c80.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)z53c80.c - $(QUIET)$(COPY) $(COPYFLG) z53c80.rel $(OBJ) - $(QUIET)$(DEL) $(DELFLG) z53c80.* - -# -# Compile ersatz printf routine for use in CP/M-80 command files -# -$(OBJ)cprintf.rel: $(SRC)cprintf.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)cprintf.c - $(QUIET)$(COPY) $(COPYFLG) cprintf.rel obj - $(QUIET)$(DEL) $(DELFLG) cprintf.* - -############################################################ - -# Build CP/M 2.2 command files (copyfile.com, fdisk.com) - -#----------------------------------------------------------- - -$(COM)copyfile.com: $(OBJ)copyfile.com $(MK) - $(QUIET)$(COPY) $(OBJ)copyfile.com $(COM)copyfile.com - $(QUIET)$(DEL) $(DELFLG) copyfile.* - -$(OBJ)copyfile.com: $(OBJ)copyfile.hex $(LOAD) $(BINFILES) $(MK) - $(QUIET)$(LOAD) $(OBJ)copyfile - -$(OBJ)copyfile.hex: $(OBJ)copyfile.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)copyfile.ihx $(OBJ)copyfile.hex - -$(OBJ)copyfile.ihx: $(OBJ)copyfile.rel $(COMRELS) $(TMP)copyfile.arf $(MK) - $(QUIET)$(COPY) $(TMP)copyfile.arf $(TMP)copyfile.lnk - - $(QUIET)$(SDLD) $(LOPTS) -nf $(TMP)copyfile.lnk - $(QUIET)$(COPY) $(COPYFLG) copyfile.ihx obj - $(QUIET)$(COPY) $(COPYFLG) copyfile.map map - -############################################################## -# Dynamicaly create linker command file for copyfile utility # -# Now uses the macro controlled ECHO feature # -############################################################## -$(TMP)copyfile.arf: Makefile - $(ECHO) -mjx > $(TMP)copyfile.arf - $(ECHO) -i copyfile.ihx >> $(TMP)copyfile.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)copyfile.arf - $(ECHO) -l z80 >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cpm0.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)copyfile.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cpmbdos.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cprintf.rel >> $(TMP)copyfile.arf - $(ECHO) -e >> $(TMP)copyfile.arf - -$(OBJ)copyfile.rel: $(SRC)copyfile.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)copyfile.c - $(QUIET)$(COPY) copyfile.rel obj - $(QUIET)$(DEL) $(DELFLG) copyfile.rel - ls obj - -#----------------------------------------------------------- - -# -# Use locally compiled 'load' command to covert Intel -# hex formal file to a binary CP/M-80 command file. -# -$(COM)fdisk.com: $(OBJ)fdisk.hex $(TOOLS) $(MK) - $(QUIET)$(BIN)load $(OBJ)fdisk - $(QUIET)$(COPY) $(COPYFLG) $(OBJ)fdisk.com com - $(QUIET)$(DEL) $(DELFLG) fdisk.* - -# -# rename 'ihx' output of linker to 'hex' - -$(OBJ)fdisk.hex: $(OBJ)fdisk.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)fdisk.ihx $(OBJ)fdisk.hex - -$(OBJ)fdisk.ihx: $(OBJ)fdisk.rel $(TMP)fdisk.arf $(MK) - $(QUIET)$(COPY) $(TMP)fdisk.arf $(TMP)fdisk.lnk - $(QUIET)$(COPY) $(TMP)fdisk.arf $(TMP)fdisk.lk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)fdisk.lnk - $(QUIET)$(COPY) $(COPYFLG) fdisk.ihx $(OBJ)fdisk.ihx - $(QUIET)$(COPY) $(COPYFLG) fdisk.map map - -$(OBJ)fdisk.rel: $(SRC)fdisk.c $(INCFILES) $(MK) - $(QUIET)$(SDCC) -I inc $(SDCCFLG) $(SRC)fdisk.c - $(QUIET)$(COPY) $(COPYFLG) fdisk.rel $(OBJ) - -############################################################################ -# Dynamically created linker command file for fdisk utility (CP/M version) # -# Now uses macro controlled ECHO feature # -############################################################################ -$(TMP)fdisk.arf: $(MK) - $(ECHO) -mjx > $(TMP)fdisk.arf - $(ECHO) -i fdisk.ihx >> $(TMP)fdisk.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)fdisk.arf - $(ECHO) -l z80 >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cpm0.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)fdisk.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cpmbdos.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cprintf.rel >> $(TMP)fdisk.arf - $(ECHO) -e >> $(TMP)fdisk.arf - - -#----------------------------------------------------------- - -# Also build host version of fdisk for testing purposes - -$(BIN)fdisk$(EXE): $(SRC)fdisk.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)fdisk.c -o $(BIN)fdisk - -############################################################ - -# Build CP/M-80 Command File Structure Files - -$(OBJ)cpm0.rel: $(SRC)cpm0.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cpm0.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpm0.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpm0.lst $(LST) - -$(OBJ)cpmbdos.rel: $(SRC)cpmbdos.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cpmbdos.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpmbdos.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpmbdos.lst $(LST) - -############################################################ - -# Build ROM Image structure files - -$(OBJ)crt0.rel: $(SRC)crt0.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0.lst $(LST) - -$(OBJ)crt0jplp.rel: $(SRC)crt0jplp.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0jplp.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0jplp.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0jplp.lst $(LST) - -$(OBJ)crt0scrm.rel: $(SRC)crt0scrm.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0scrm.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0scrm.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0scrm.lst $(LST) - -$(OBJ)bdosb01.rel: $(SRC)bdosb01.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)bdosb01.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)bdosb01.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)bdosb01.lst $(LST) - -$(OBJ)ccpb03.rel: $(SRC)ccpb03.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)ccpb03.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)ccpb03.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)ccpb03.lst $(LST) - -# -# Assemble hardware control code for SBC V2 -# -$(OBJ)cbios.rel: $(SRC)cbios.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cbios.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbios.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbios.lst $(LST) - -# -# Assemble a monitor program for the SBC V2 -# -$(OBJ)dbgmon.rel: $(SRC)dbgmon.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)dbgmon.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dbgmon.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dbgmon.lst $(LST) - -########################################################### - -# Build host based tools ( dwgh2b, jrch2b, load, verify) - -$(DWGH2B): $(SRC)dwgh2b.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)dwgh2b.c -o $(BIN)dwgh2b$(EXE) - -# -# Compile John Coffman's hex2bin program -# -$(JRCH2B): $(SRC)jrch2b.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)jrch2b.c -o $(BIN)jrch2b$(EXE) - $(QUIET)$(COPY) $(COPYFLG) $(BIN)jrch2b $(BIN)jrcb2h - -# -# Compile Doug's "load" program -# -$(LOAD): $(SRC)load.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)load.c -o $(BIN)load$(EXE) - -$(SYSGEN): $(SRC)sysgen.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)sysgen.c -o $(BIN)sysgen$(EXE) - -# -# Compile Doug's verif program that compares binary file regions -# -$(VERIFY): $(SRC)verify.c Makefile $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)verify.c -o $(BIN)verify - -$(BIN)lechocr: $(SRC)lechocr.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lechocr.c -o $(BIN)lechocr - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lechocr.c - $(QUIET)$(COPY) lechocr.exe $(BIN) - -$(BIN)lecholf: $(SRC)lecholf.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholf.c -o $(BIN)lecholf - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholf.c - $(COPY) lecholf.exe $(BIN) - -$(BIN)lechocrlf: $(SRC)lechocrlf.c $(MK) - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lechocrlf.c -o $(BIN)lechocrlf - -$(BIN)lecholfcr: $(SRC)lecholfcr.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholfcr.c -o $(BIN)lecholfcr - $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholfcr.c -o $(BIN)lecholfcr - -############################################################ - -# Builder specific utility rules - -dwginstall: - $(COPY) $(COMFILES) ~/Documents/devobox/cdrive - -############################################################ - -# -# Delete all dynamically generated files that don't need to be -# saved. -# -clean: - $(QUIET)$(DEL) $(DELFLG) *.hex *.ihx *.lst *.rel *.rst *.lnk *.lk - $(QUIET)$(DEL) $(DELFLG) *.sym *.map *.noi *.asm *.com *.ini *.bin - $(QUIET)$(DEL) $(DELFLG) obj$(DELIM)*.* - $(QUIET)$(DEL) $(DELFLG) bin$(DELIM)*.* - $(QUIET)$(DEL) $(DELFLG) com$(DELIM)*.* - $(QUIET)$(DEL) $(DELFLG) rom$(DELIM)*.* - $(QUIET)$(DEL) $(DELFLG) tmp$(DELIM)*.* - $(QUIET)$(DEL) $(DELFLG) map$(DELIM)*.* - $(QUIET)$(DEL) $(DELFLG) lst$(DELIM)*.* - -################## -# eof - Makefile # -################## diff --git a/branches/dgg/cpurom/exp/makefile.mac b/branches/dgg/cpurom/exp/makefile.mac deleted file mode 100644 index 506bc8c0..00000000 --- a/branches/dgg/cpurom/exp/makefile.mac +++ /dev/null @@ -1,26 +0,0 @@ -# ubios/makefile.mac 8/8/2011 dwg - - -DELIM = / -SPREFIX = /Developer/sdcc -SDAS = $(SPREFIX)/bin/sdasz80 -SDASFLG = -plosff -Iinc -SDCC = $(SPREFIX)/bin/sdcc -SDCCFLG = -c -mz80 -D__SDCC__=1 -I inc -SDCCLIB = $(SPREFIX)/share/sdcc/lib/z80 -SDLD = $(SPREFIX)/bin/sdldz80 -SDLDFLG = -TPREFIX = -TCC = gcc -TCCFLG = -I inc -COPY = cp -DEL = rm -DELFLG = -f -# use native ECHO o Mac OS X -ECHO = echo -REN = mv -EXE = - -include common.mak - - - diff --git a/branches/dgg/cpurom/exp/makefile.win b/branches/dgg/cpurom/exp/makefile.win deleted file mode 100644 index c324b33d..00000000 --- a/branches/dgg/cpurom/exp/makefile.win +++ /dev/null @@ -1,24 +0,0 @@ - -DELIM = \ -SDRIVE = C: -SPREFIX = $(SDRIVE)\sdcc -SDAS = $(SPREFIX)\bin\sdasz80 -SDASFLG = -plosff -SDCC = $(SPREFIX)\bin\sdcc -SDCCFLG = -c -mz80 -D__SDCC__=1 -I inc -SDCCLIB = $(SPREFIX)\lib\z80 -SDLD = $(SPREFIX)\bin\sdldz80 -SDLDFLG = -TPREFIX = -TCC = gcc -TCCOPT = -I inc -COPY = copy -DEL = erase -DELFLG = /Q -REN = rename -ECHO = $(BIN)lecholf -EXE = .exe - -.include common.mak - - diff --git a/branches/dgg/cpurom/inc/agm1264f.h b/branches/dgg/cpurom/inc/agm1264f.h deleted file mode 100644 index b32019f9..00000000 --- a/branches/dgg/cpurom/inc/agm1264f.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * - * agm1264f.h 5/14/2011 dwg - - * 8 lines of 21 characters - * - */ - -/* - - 1 2 - 123456789012345678901 - --------------------- -1 |1234 11223344 1234 | -2 | | -3 | | -4 | | -5 | | -6 | | -7 | | -8 | | - --------------------- - -/* This is a 7x5 character layout showing how much text data can be display on the agm1264f - 1 1 1 - 1 2 3 4 5 6 7 8 9 0 1 2 - 01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567 - --------------------------------------------------------------------------------------------------------------------------------- - 0 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 1 | 2 | - 2 | 3 | - 3 | 4 | - 4 | 5 | - 5 | 6 | - 6 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 7 | | - 8 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 9 | 2 | -10 | 3 | - 1 | 4 | - 2 | 5 | - 3 | 6 | - 4 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 5 | | - 6 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 7 | 2 | - 8 | 3 | - 9 | 4 | -20 | 5 | - 1 | 6 | - 2 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 3 | | - 4 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 5 | 2 | - 6 | 3 | | - 7 | 4 | - 8 | 5 | - 9 | 6 | -30 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 1 | | - 2 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 3 | 2 | - 4 | 3 | - 5 | 4 | - 6 | 5 | - 7 | 6 | - 8 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 9 | | -40 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 1 | 2 | - 2 | 3 | - 3 | 4 | - 4 | 5 | - 5 | 6 | - 6 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 7 | | - 8 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 9 | 2 | -50 | 3 | - 1 | 4 | - 2 | 5 | - 3 | 6 | - 4 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 5 | | - 6 | 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 7 | 2 | - 8 | 3 | - 9 | 4 | -60 | 5 | - 1 | 6 | - 2 | 72345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 12345 | - 3 | | - --------------------------------------------------------------------------------------------------------------------------------- -*/ - - diff --git a/branches/dgg/cpurom/inc/cpmbdos.h b/branches/dgg/cpurom/inc/cpmbdos.h deleted file mode 100644 index 6bb522db..00000000 --- a/branches/dgg/cpurom/inc/cpmbdos.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * CP/M-80 v2.2 BDOS Interfaces - * Copyright (C) Douglas W. Goodall - * For Non-Commercial use by N8VEM - * 5/10/2011 dwg - initial version -*/ -#define EXIT_SUCCESS 0 -#define EXIT_FAILURE 1 - -#define C_READ 1 -#define C_WRITE 2 -#define A_READ 3 -#define A_WRITE 4 -#define L_WRITE 5 -#define C_RAWIO 6 -#define GETIOBYTE 7 -#define SETIOBYTE 8 -#define C_WRITESTR 9 -#define C_READSTR 10 -#define F_OPEN 15 -#define F_CLOSE 16 -#define F_DELETE 19 -#define F_READ 20 -#define F_WRITE 21 -#define F_MAKE 22 -#define F_RENAME 23 -#define DRV_LOGINVEC 24 -#define DRV_GET 25 -#define F_DMAOFF 26 -#define DRV_ALLOCVEC 27 -#define DRV_SETRO 28 -#define DRV_ROVEC 29 -#define F_ATTRIB 30 -#define DRV_DPB 31 -#define F_USERNUM 32 -#define F_READRAND 33 -#define F_WRITERAND 34 -#define F_SIZE 35 -#define F_RANDREC 36 -#define DRV_RESET 37 -#define F_WRITEZF 40 - - -struct BDOSCALL { - unsigned char func8; - unsigned int parm16; -}; - -unsigned char cpmbdos(struct BDOSCALL *p); - -struct FCB { - unsigned char drive; - char filename[8]; - char filetype[3]; - unsigned char ex; - unsigned char s1; - unsigned char s2; - unsigned char rc; - unsigned char al[16]; - unsigned char cr; - unsigned char r0; - unsigned char r1; - unsigned char r2; -}; - -struct READSTR { - unsigned char size; - unsigned char len; - char bytes[80]; - } rsbuffer; - -struct BDOSCALL readstr = { C_READSTR, { (unsigned int)&rsbuffer } }; - -char * mygets(char *p) -{ - memset(rsbuffer.bytes,0,sizeof(rsbuffer.bytes)); - rsbuffer.size = sizeof(rsbuffer.bytes); - rsbuffer.len = 0; - cpmbdos(&readstr); - rsbuffer.bytes[rsbuffer.len] = '\n'; - strcpy(p,rsbuffer.bytes); - return p; -} - -#define gets mygets - -/*****************/ -/* eof - cpm80.h */ -/*****************/ diff --git a/branches/dgg/cpurom/inc/cprintf.h b/branches/dgg/cpurom/inc/cprintf.h deleted file mode 100644 index 925275e3..00000000 --- a/branches/dgg/cpurom/inc/cprintf.h +++ /dev/null @@ -1,7 +0,0 @@ -/* cprintf.h */ - -int cprintf(const char * fmt, ...); - -#define printf cprintf - - diff --git a/branches/dgg/cpurom/inc/diskio.h b/branches/dgg/cpurom/inc/diskio.h deleted file mode 100644 index 9a198457..00000000 --- a/branches/dgg/cpurom/inc/diskio.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * diskio.h - * - */ - -__sfr __at (DISKIO_IDE + 0x00) pIDELO; -__sfr __at (DISKIO_IDE + 0x01) pIDEERR; -__sfr __at (DISKIO_IDE + 0x02) pIDESECTC; -__sfr __at (DISKIO_IDE + 0x03) pIDESECTN; -__sfr __at (DISKIO_IDE + 0x04) pIDECYLLO; -__sfr __at (DISKIO_IDE + 0x05) pIDECYLHI; -__sfr __at (DISKIO_IDE + 0x06) pIDEHEAD; -__sfr __at (DISKIO_IDE + 0x07) pIDESTTS; -__sfr __at (DISKIO_IDE + 0x08) pIDEHI; -__sfr __at (DISKIO_IDE + 0x0E) pIDECTRL; - -__sfr __at (DISKIO_FLP + 0x06) pFMSR; -__sfr __at (DISKIO_FLP + 0x07) pFDATA; -__sfr __at (DISKIO_FLP + 0x0A) pFLATCH; -__sfr __at (DISKIO_FLP + 0x0C) pFDMA; - -/* - * - * eof - diskio.h - * - */ - - diff --git a/branches/dgg/cpurom/inc/ds1302.h b/branches/dgg/cpurom/inc/ds1302.h deleted file mode 100644 index 4898ec5a..00000000 --- a/branches/dgg/cpurom/inc/ds1302.h +++ /dev/null @@ -1,7 +0,0 @@ -/* - * - * ds1302 Dallas Real Time Clock module - * - */ - - diff --git a/branches/dgg/cpurom/inc/i8255.h b/branches/dgg/cpurom/inc/i8255.h deleted file mode 100644 index 11761e9c..00000000 --- a/branches/dgg/cpurom/inc/i8255.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * i8255.h Intel 8255 - * - */ - - -void uart_init(U8 baud); -U8 uart_conin(void); -void uart_conout(U8 data); - -/* - * - * eof - i8255.h - * - */ diff --git a/branches/dgg/cpurom/inc/jrctypes.h b/branches/dgg/cpurom/inc/jrctypes.h deleted file mode 100644 index c97ed7eb..00000000 --- a/branches/dgg/cpurom/inc/jrctypes.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __MYTYPES_H -#define __MYTYPES_H 1 - -typedef unsigned char byte; -typedef unsigned short word; -typedef unsigned long dword; - - -#ifdef __SDCC__ -#define outp(port,byte) port = (byte) -#define inp(port) (port) -#endif - -#define nelem(x) (sizeof(x)/sizeof(x[0])) - -#endif /* __MYTYPES_H */ diff --git a/branches/dgg/cpurom/inc/ns16550.h b/branches/dgg/cpurom/inc/ns16550.h deleted file mode 100644 index 6e81ada9..00000000 --- a/branches/dgg/cpurom/inc/ns16550.h +++ /dev/null @@ -1,15 +0,0 @@ -/* - * n16550.h National 16550 - * - */ - -#define UART_DLAB 0x80 -#define UART_BAUD_9600 12 -#define UART_RDA 0x01 -#define UART_TBE 0x20 - -/* - * - * eof - n16550.h - * - */ diff --git a/branches/dgg/cpurom/inc/ns16550.inc b/branches/dgg/cpurom/inc/ns16550.inc deleted file mode 100644 index f405d38a..00000000 --- a/branches/dgg/cpurom/inc/ns16550.inc +++ /dev/null @@ -1,8 +0,0 @@ -; ns16550.inc 8/7/2011 dwg - National 16550 - -UART_DLAB = 0x80 -UART_BAUD_9600 = 12 -UART_RDA = 0x01 -UART_TBE = 0x20 - -; eof - ns16550.inc diff --git a/branches/dgg/cpurom/inc/portab.h b/branches/dgg/cpurom/inc/portab.h deleted file mode 100644 index 6a814a13..00000000 --- a/branches/dgg/cpurom/inc/portab.h +++ /dev/null @@ -1,12 +0,0 @@ -/************/ -/* portab.h */ -/************/ - -#define TRUE 1 -#define FALSE 0 - -#define U8 unsigned char - -/******************/ -/* eof - portab.h */ -/******************/ diff --git a/branches/dgg/cpurom/inc/sbcv2.h b/branches/dgg/cpurom/inc/sbcv2.h deleted file mode 100644 index 83951d3d..00000000 --- a/branches/dgg/cpurom/inc/sbcv2.h +++ /dev/null @@ -1,52 +0,0 @@ -/* - * sbcv2.h - Macros describing the N8VEM SBC V2 - * - */ - -#define SBCV2 - -/* set i/o base to first block of 32 addresses - possible are 0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0 - depending oon setting of dip switches on board -*/ - -#define SBCV2_IO_BASE 0x00 -#define UART_IO_BASE ( SBCV2_IO_BASE + 0x68 ) - -__sfr __at (UART_IO_BASE+0) rUART_RBR; -__sfr __at (UART_IO_BASE+0) wUART_THR; -__sfr __at (UART_IO_BASE+0) wUART_DIV_LO; -__sfr __at (UART_IO_BASE+1) wUART_DIV_HI; - -__sfr __at (UART_IO_BASE+1) wUART_IER; -__sfr __at (UART_IO_BASE+2) rUART_IIR; -__sfr __at (UART_IO_BASE+3) wUART_LCR; -__sfr __at (UART_IO_BASE+4) wUART_MCR; -__sfr __at (UART_IO_BASE+5) rUART_LSR; -__sfr __at (UART_IO_BASE+6) rUART_MSR; -__sfr __at (UART_IO_BASE+7) wUART_FCR; - - -#define DISKIO_IDE 0x20 - -#define DISKIO_FLP 0x30 - -#define PPORT 0x60 - -#define MPCL 0x70 -__sfr __at (MPCL + 0x08) pMPCL_RAM; -__sfr __at (MPCL + 0x0c) pMPCL_ROM; - -#define RAMTARG_CPM 0x2000 -#define ROMSTART_CPM 0x0000 -#define CCPSIZ_CPM 0x2000 - -#define LOADER_ORG 0x0000 -#define CPM_ORG 0x0A00 -#define MON_ORG 0x3800 -#define ROM_G 0x5000 -#define ROM_F 0x8000 -/* -#define VDU_DRV 0xF8100 -*/ - diff --git a/branches/dgg/cpurom/inc/scsi2ide.h b/branches/dgg/cpurom/inc/scsi2ide.h deleted file mode 100644 index 023b8a99..00000000 --- a/branches/dgg/cpurom/inc/scsi2ide.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * - * scsi2ide.h - Macros describing the N8VEM SCSI2IDE - * Friday July 29, 2011 Douglas W. Goodall - * - */ - -#define SCSI2IDE - -/* set i/o base to first block of 32 addresses - possible are 0x00 0x20 0x40 0x60 0x80 0xA0 0xC0 0xE0 - depending oon setting of dip switches on board -*/ - -#define SCSI2IDE_IO_BASE 0x00 - -#define IDE_IO_BASE ( SCSI2IDE_IO_BASE + 0 ) -#define SCSI_IO_BASE ( SCSI2IDE_IO_BASE + 8 ) -#define UART_IO_BASE ( SCSI2IDE_IO_BASE + 16 ) -#define DACK_IO_BASE ( SCSI2IDE_IO_BASE + 24 ) - -__sfr __at (UART_IO_BASE+0) rUART_RDR; -__sfr __at (UART_IO_BASE+0) wUART_TDR; -__sfr __at (UART_IO_BASE+0) wUART_DIV_LO; -__sfr __at (UART_IO_BASE+1) wUART_DIV_HI; -__sfr __at (UART_IO_BASE+1) wUART_IER; -__sfr __at (UART_IO_BASE+2) rUART_IIR; -__sfr __at (UART_IO_BASE+3) wUART_LCR; -__sfr __at (UART_IO_BASE+4) wUART_MCR; -__sfr __at (UART_IO_BASE+5) rUART_LSR; -__sfr __at (UART_IO_BASE+6) rUART_MSR; -__sfr __at (UART_IO_BASE+7) wUART_FCR; - -__sfr __at (SCSI_IO_BASE+0) rSCSI_CSCSID; -__sfr __at (SCSI_IO_BASE+0) wSCSI_OD; -__sfr __at (SCSI_IO_BASE+1) rwSCSI_IC; -__sfr __at (SCSI_IO_BASE+2) rwSCSI_M; -__sfr __at (SCSI_IO_BASE+3) rwSCSI_TC; -__sfr __at (SCSI_IO_BASE+4) rSCSI_CSCSIBS; -__sfr __at (SCSI_IO_BASE+4) wSCSI_SE; -__sfr __at (SCSI_IO_BASE+5) rSCSI_BS; -__sfr __at (SCSI_IO_BASE+5) wSCSI_SDMAS; -__sfr __at (SCSI_IO_BASE+6) rSCSI_ID; -__sfr __at (SCSI_IO_BASE+6) wSCSI_SDMATR; -__sfr __at (SCSI_IO_BASE+7) rSCSI_RPI; -__sfr __at (SCSI_IO_BASE+7) wSCSI_SDMAIR; - diff --git a/branches/dgg/cpurom/inc/scsi2ide.inc b/branches/dgg/cpurom/inc/scsi2ide.inc deleted file mode 100644 index 64b938ca..00000000 --- a/branches/dgg/cpurom/inc/scsi2ide.inc +++ /dev/null @@ -1,20 +0,0 @@ -; scsi2ide.inc 8/7/2011 dwg - macros describing the N8VEM SCSI2IDE - -SCSI2IDE_IO_BASE = 0 - -UART_IO_BASE = SCSI2IDE_IO_BASE+16 - -rUART_RDR = UART_IO_BASE + 0 -wUART_TDR = UART_IO_BASE + 0 -wUART_DIV_LO = UART_IO_BASE + 0 -wUART_DIV_HI = UART_IO_BASE + 1 -wUART_IER = UART_IO_BASE + 1 -rUART_IIR = UART_IO_BASE + 2 -wUART_LCR = UART_IO_BASE + 3 -wUART_MCR = UART_IO_BASE + 4 -rUART_LSR = UART_IO_BASE + 5 -rUART_MSR = UART_IO_BASE + 6 -wUART_FCR = UART_IO_BASE + 7 - -; eof - scsi2ide.inc - diff --git a/branches/dgg/cpurom/inc/z53c80.h b/branches/dgg/cpurom/inc/z53c80.h deleted file mode 100644 index 9a7039ed..00000000 --- a/branches/dgg/cpurom/inc/z53c80.h +++ /dev/null @@ -1,24 +0,0 @@ -/* - * z53c80.h Zilog Z53C8003VSC - * - */ - -/* -__sfr __at (UART + 0) pPORTA; -__sfr __at (UART + 1) pPORTB; -__sfr __at (UART + 2) pPORTC; -__sfr __at (UART + 3) pCNTRL; -*/ - -void scsi_init(void); - -/* -U8 uart_conin(void); -void uart_conout(U8 data); -*/ - -/* - * - * eof - z53c80.h - * - */ diff --git a/branches/dgg/cpurom/makeclean.bat b/branches/dgg/cpurom/makeclean.bat deleted file mode 100644 index 64ef22dd..00000000 --- a/branches/dgg/cpurom/makeclean.bat +++ /dev/null @@ -1,3 +0,0 @@ -wmake -f makefile.xp clean -rem wmake -f makefile.xp -dir rom diff --git a/branches/dgg/cpurom/makecpurom.bat b/branches/dgg/cpurom/makecpurom.bat deleted file mode 100644 index 5798c184..00000000 --- a/branches/dgg/cpurom/makecpurom.bat +++ /dev/null @@ -1,3 +0,0 @@ -wmake -f makefile.xp clean -wmake -f makefile.xp etools rom\scsiscrm.rom -dir rom diff --git a/branches/dgg/cpurom/makefile.xp b/branches/dgg/cpurom/makefile.xp deleted file mode 100644 index 498a5396..00000000 --- a/branches/dgg/cpurom/makefile.xp +++ /dev/null @@ -1,646 +0,0 @@ -######################################################## -# Makefile for Doug's Unified BIOS 1/28/2013 # -# The BIOS and associated utilities are generated # -# using the Small Device C Compiler (SDCC) & tools # -# With multiplatform enhancements by John Coffman # -# # -# sdcc.l00 added because stupid Windoze 'echo' appends # -# a confusing SPACE to the end of every line. # -######################################################## - -##################################################### -# SPREFIX tells where the SDCC package in installed # -# The SDCC package is used to assemble Z80 portions # -# of the software such as the ROM and perhaps some # -# .COM files such as FDISK. # -##################################################### - -################################################################# -# TPREFIX tells where the host development tools are installed. # -# The host tools are used to manipulate the Z80 objects after # -# the basic assemblies and compilations have been completed. # -################################################################# - -################################################################### -# SDCC is not available on the DOS host, so something else may be # -# used at the descretion of the builder. (TASM for instance). # -################################################################### - -################################################################### -# The COPY, DEL and RENAME macros are used to customize the build # -# rules for the host enviroonment. # -################################################################### - -#------------------------------------------- -# Choose one only, then Make will work for -# your platform. - -#CFG = $(shell uname) -# Mac OS X returns 'Darwin' -# Linux returns 'Linux' - -#CFG = dos -#CFG = linux -#CFG = macosx -CFG = windows - -#------------------------------------------- - -DELIM = \ -SDRIVE = C: -SPREFIX = $(SDRIVE)\Program Files\sdcc -#SDAS = $(SPREFIX)\bin\sdasz80 -SDAS = sdasz80 -SDASFLG = -plosff -Iinc -#SDCC = $(SPREFIX)\bin\sdcc -SDCC = sdcc -SDCCFLG = -c -mz80 -D__SDCC__=1 -I inc -SDCCLIB = $(SPREFIX)\lib\z80 -#SDLD = $(SPREFIX)\bin\sdldz80 -SDLD = sdldz80 -SDLDFLG = -TPREFIX = -TCC = gcc -TCCOPT = -I inc -COPY = copy -DEL = erase -DELFLG = /Q -REN = rename - -# This is special handling for John Coffman to get around funky windows -# behavior where echo adds spurious space o end f line -# ECHO = { lecho | lechocr | lecholf | lechocrlf | lecholfcr } - -#ECHO = $(BIN)$(DELIM)lechocr -ECHO = $(BIN)lecholf - -EXE = .exe - - -#------------------------------------------- -############################################################ - -# Misc other macros - -BIN = bin$(DELIM) -COM = com$(DELIM) -INC = inc$(DELIM) -LIB = lib$(DELIM) -LST = lst$(DELIM) -MAP = map$(DELIM) -OBJ = obj$(DELIM) -REF = ref$(DELIM) -ROM = rom$(DELIM) -SRC = src$(DELIM) -TMP = tmp$(DELIM) - -# CP/M-80 v2.2 Command files written in SDCC -COMFILES = $(COM)copyfile.com $(COM)fdisk.com - -# Components used by CP/M-80 v2.2 Command files -COMRELS = $(OBJ)cpm0.rel $(OBJ)cpmbdos.rel $(OBJ)cprintf.rel - -# Components of ROM image containing CP/M for SBC V2 -CPMRELS = $(OBJ)crt0.rel $(OBJ)dbgmon.rel $(OBJ)bdosb01.rel $(OBJ)ccpb03.rel $(OBJ)cbios.rel - -# Components of ROM image used in test protocols -ROMRELS = $(OBJ)crt0jplp.rel $(OBJ)crt0scrm.rel - - -# Components that control hardware in SBC V2 -SBCV2HW = - -# Components that control hardware in the SCSI2IDE -SCSI2IDEHW = $(OBJ)z53c80.rel - -FDISK = $(BIN)fdisk$(EXE) -DWGH2B = $(BIN)dwgh2b$(EXE) -INCFILES = $(INC)cpmbdos.h $(INC)cprintf.h $(INC)portab.h -JRCH2B = $(BIN)jrch2b$(EXE) -LOAD = $(BIN)load$(EXE) -MK = Makefile -#QUIET = @ - -# ROM images for SBC V2 and N8 -ROMFILES = $(ROM)scsiscrm.rom $(ROM)scsijplp.rom $(ROM)n8.rom $(ROM)baseline.rom $(ROM)n8.rom -SCSI2IDE = $(ROM)scsi2ide.rom - -SYSGEN = $(BIN)sysgen$(EXE) -VERIFY = $(BIN)verify$(EXE) - -# C programs compiled on host system used in build -TOOLS = $(FDISK) $(DWGH2B) $(LOAD) $(JRCH2B) $(SYSGEN) - -# Versions of 'echo' compiled on host system -ETOOLS = $(BIN)lechocr.exe $(BIN)lecholf.exe $(BIN)lechocrlf.exe $(BIN)lecholfcr.exe - -# dribdos.rel is not part of the production set yet -##TEST = dribdos.rel - -############################################################ - -all: $(ETOOLS) $(TOOLS) $(BINFILES) $(COMFILES) $(CPMFILES) $(ROMFILES) - -#all: $(TEST) $(ROMFILES) $(COMFILES) - -etools: $(ETOOLS) -roms: $(ROMFILES) -scsi2ide: $(SCSI2IDE) - -############################################################ - -# A test assembly of DRI source code for BDOS (from SIMH) -dribdos.rel: $(SRC)dribdos.s - $(QUIET)$(SDAS) $(SDASFLG) dribdos.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dribdos.lst $(LST) - -############################################################ -############################################################ - -# Build SCSIJPLP ROM image - -$(ROM)scsijplp.rom: $(OBJ)scsijplp.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsijplp.bin $(ROM)scsijplp.rom - $(QUIET)$(DEL) $(DELFLG) scsijplp.* - -$(OBJ)scsijplp.bin: $(OBJ)scsijplp.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsijplp - -$(OBJ)scsijplp.hex: $(OBJ)scsijplp.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsijplp.ihx $(OBJ)scsijplp.hex - -$(OBJ)scsijplp.ihx: $(OBJ)crt0jplp.rel $(TMP)scsijplp.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsijplp.arf $(TMP)scsijplp.lk - $(QUIET)$(COPY) $(TMP)scsijplp.arf $(TMP)scsijplp.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsijplp.lnk - $(QUIET)$(COPY) $(COPYFLG) scsijplp.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsijplp.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsi2ide # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsijplp.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsijplp.arf - $(ECHO) -i scsijplp.ihx >> $(TMP)scsijplp.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsijplp.arf - $(ECHO) -l z80 >> $(TMP)scsijplp.arf - $(ECHO) $(OBJ)crt0jplp.rel >> $(TMP)scsijplp.arf - $(ECHO) -e >> $(TMP)scsijplp.arf - -############################################################ -############################################################ -############################################################ -############################################################ - -# Build SCSISCRM ROM image - -$(ROM)scsiscrm.rom: $(OBJ)scsiscrm.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsiscrm.bin $(ROM)scsiscrm.rom - $(QUIET)$(DEL) $(DELFLG) scsiscrm.* - -$(OBJ)scsiscrm.bin: $(OBJ)scsiscrm.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsiscrm - -$(OBJ)scsiscrm.hex: $(OBJ)scsiscrm.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsiscrm.ihx $(OBJ)scsiscrm.hex - -$(OBJ)scsiscrm.ihx: $(OBJ)crt0scrm.rel $(TMP)scsiscrm.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsiscrm.arf $(TMP)scsiscrm.lk - $(QUIET)$(COPY) $(TMP)scsiscrm.arf $(TMP)scsiscrm.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsiscrm.lnk - $(QUIET)$(COPY) $(COPYFLG) scsiscrm.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsiscrm.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsiscrm # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsiscrm.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsiscrm.arf - $(ECHO) -i scsiscrm.ihx >> $(TMP)scsiscrm.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsiscrm.arf - $(ECHO) -l z80 >> $(TMP)scsiscrm.arf - $(ECHO) $(OBJ)crt0scrm.rel >> $(TMP)scsiscrm.arf - $(ECHO) -e >> $(TMP)scsiscrm.arf - -############################################################ -############################################################ - - - - - -############################################################ -############################################################ - -# Build SCSI2IDE ROM image - -$(ROM)scsi2ide.rom: $(OBJ)scsi2ide.bin $(MK) - $(QUIET)$(COPY) $(OBJ)scsi2ide.bin $(ROM)scsi2ide.rom - $(QUIET)$(DEL) $(DELFLG) scsi2ide.* - -$(OBJ)scsi2ide.bin: $(OBJ)scsi2ide.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)scsi2ide - -$(OBJ)scsi2ide.hex: $(OBJ)scsi2ide.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)scsi2ide.ihx $(OBJ)scsi2ide.hex - -$(OBJ)scsi2ide.ihx: $(CPMRELS) $(SCSI2IDEHW) $(OBJ)scsi2ide.rel $(TMP)scsi2ide.arf $(MK) - $(QUIET)$(COPY) $(TMP)scsi2ide.arf $(TMP)scsi2ide.lk - $(QUIET)$(COPY) $(TMP)scsi2ide.arf $(TMP)scsi2ide.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)scsi2ide.lnk - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.map $(MAP) - -######################################################### -# Dynamically generate linker control file for scsi2ide # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)scsi2ide.arf: $(MK) - $(ECHO) -mjx > $(TMP)scsi2ide.arf - $(ECHO) -i scsi2ide.ihx >> $(TMP)scsi2ide.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)scsi2ide.arf - $(ECHO) -l z80 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _CCPB03 = 0xD000 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _BDOSB01 = 0xD800 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _CBIOS = 0xE600 >> $(TMP)scsi2ide.arf -# $(ECHO) -b _DBGMON = 0x8000 >> $(TMP)scsi2ide.arf - $(ECHO) $(OBJ)crt0.rel >> $(TMP)scsi2ide.arf - $(ECHO) $(OBJ)scsi2ide.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)scsi2ide.arf -# $(ECHO) $(OBJ)cbios.rel >> $(TMP)scsi2ide.arf - $(ECHO) -e >> $(TMP)scsi2ide.arf - -######################################################## -# Compile C portion of the scsi2ide EEPROM Image -$(OBJ)scsi2ide.rel: $(SRC)scsi2ide.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) -c $(SRC)scsi2ide.c - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) scsi2ide.lst $(LST) - - -############################################################ -############################################################ - -# Build SBC V2 ROM image - -$(ROM)baseline.rom: $(OBJ)baseline.bin $(MK) - $(QUIET)$(COPY) $(OBJ)baseline.bin $(ROM)baseline.rom - $(QUIET)$(DEL) $(DELFLG) baseline.* - -$(OBJ)baseline.bin: $(OBJ)baseline.hex $(DWGH2B) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)baseline - -$(OBJ)baseline.hex: $(OBJ)baseline.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)baseline.ihx $(OBJ)baseline.hex - -$(OBJ)baseline.ihx: $(CPMRELS) $(SBCV2HW) $(OBJ)baseline.rel $(TMP)baseline.arf $(MK) - $(QUIET)$(COPY) $(TMP)baseline.arf $(TMP)baseline.lk - $(QUIET)$(COPY) $(TMP)baseline.arf $(TMP)baseline.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)baseline.lnk - $(QUIET)$(COPY) $(COPYFLG) baseline.ihx $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) baseline.map $(MAP) - -######################################################### -# Dynamically generate linker control file for baseline # -# (now uses the macro controlled ECHO feature # -######################################################### -$(TMP)baseline.arf: $(MK) - $(ECHO) -mjx > $(TMP)baseline.arf - $(ECHO) -i baseline.ihx >> $(TMP)baseline.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)baseline.arf - $(ECHO) -l z80 >> $(TMP)baseline.arf - $(ECHO) -b _CCPB03 = 0xD000 >> $(TMP)baseline.arf - $(ECHO) -b _BDOSB01 = 0xD800 >> $(TMP)baseline.arf - $(ECHO) -b _CBIOS = 0xE600 >> $(TMP)baseline.arf - $(ECHO) -b _DBGMON = 0x8000 >> $(TMP)baseline.arf - $(ECHO) $(OBJ)crt0.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)baseline.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)baseline.arf - $(ECHO) $(OBJ)cbios.rel >> $(TMP)baseline.arf - $(ECHO) -e >> $(TMP)baseline.arf - -######################################################## -# Compile C portion of the Baseline PROM Image -$(OBJ)baseline.rel: $(SRC)baseline.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) -c $(SRC)baseline.c - $(QUIET)$(COPY) $(COPYFLG) baseline.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) baseline.lst $(LST) - -############################################################ - -# Build N8 ROM image - -# -# Save the resulting merged image in the Rom folder -# -$(ROM)n8.rom: $(OBJ)n8-romim.bin $(MK) - $(QUIET)$(COPY) $(OBJ)n8-romim.bin $(ROM)n8.rom - $(QUIET)$(DEL) $(DELFLG) n8.* - -# -# Convert the Intel hex file into a binary, similar -# to the results of the "copy /B ..." -# -$(OBJ)n8-romim.bin: $(OBJ)sysimage.hex $(REF)n8-romim.ref $(SYSGEN) $(HEX2BIN) $(MK) - $(QUIET)$(DWGH2B) $(OBJ)sysimage - $(QUIET)$(COPY) $(REF)n8-romim.ref $(OBJ)n8-romim.bin - $(QUIET)$(SYSGEN) -i $(OBJ)sysimage.bin $(OBJ)n8-romim.bin - -# -# Take the output of the linker and rename to the more -# recognizable .hex form and the expected name "sysimage.hex" -# -$(OBJ)sysimage.hex: $(OBJ)n8.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)n8.ihx $(OBJ)sysimage.hex - -# -# Combine the independently assembled components into one piece -# and output Intel hex file (ihx) -# -$(OBJ)n8.ihx: $(OBJ)loadern8.rel $(OBJ)dbgmon.rel $(OBJ)ccpb03.rel $(OBJ)bdosb01.rel $(OBJ)cbiosn8.rel $(TMP)n8.arf $(MK) - $(QUIET)$(COPY) $(TMP)n8.arf $(TMP)n8.lk - $(QUIET)$(COPY) $(TMP)n8.arf $(TMP)n8.lnk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)n8.lnk - $(QUIET)$(COPY) $(COPYFLG) n8.ihx $(OBJ)n8.ihx - $(QUIET)$(COPY) $(COPYFLG) n8.map $(MAP) - -$(OBJ)cbiosn8.rel: $(SRC)cbiosn8.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cbiosn8.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbiosn8.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbiosn8.lst $(LST) - -$(OBJ)loadern8.rel: $(SRC)loadern8.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)loadern8.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)loadern8.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)loadern8.lst $(LST) - -######################################################## -# Dynamically generate the linker control file for N8 # -# Now uses the macro controlled ECHO feature # -######################################################## -$(TMP)n8.arf: Makefile - $(ECHO) -mjx > $(TMP)n8.arf - $(ECHO) -i n8.ihx >> $(TMP)n8.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)n8.arf - $(ECHO) -l z80 >> $(TMP)n8.arf - $(ECHO) -b _CCPB03 = 0x0900 >> $(TMP)n8.arf - $(ECHO) -b _BDOSB01 = 0x1100 >> $(TMP)n8.arf - $(ECHO) -b _CBIOS = 0x1f00 >> $(TMP)n8.arf - $(ECHO) $(OBJ)loadern8.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)dbgmon.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)ccpb03.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)bdosb01.rel >> $(TMP)n8.arf - $(ECHO) $(OBJ)cbiosn8.rel >> $(TMP)n8.arf - $(ECHO) -e >> $(TMP)n8.arf - -############################################################ - -# Hardware specific assemblies (most likely used by BIOS's) - -# -# Assemble hardware control code for the Zilog Z53C8003V5C -# -$(OBJ)z53c80.rel: $(SRC)z53c80.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)z53c80.c - $(QUIET)$(COPY) $(COPYFLG) z53c80.rel $(OBJ) - $(QUIET)$(DEL) $(DELFLG) z53c80.* - -# -# Compile ersatz printf routine for use in CP/M-80 command files -# -$(OBJ)cprintf.rel: $(SRC)cprintf.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)cprintf.c - $(QUIET)$(COPY) $(COPYFLG) cprintf.rel obj - $(QUIET)$(DEL) $(DELFLG) cprintf.* - -############################################################ - -# Build CP/M 2.2 command files (copyfile.com, fdisk.com) - -#----------------------------------------------------------- - -$(COM)copyfile.com: $(OBJ)copyfile.com $(MK) - $(QUIET)$(COPY) $(OBJ)copyfile.com $(COM)copyfile.com - $(QUIET)$(DEL) $(DELFLG) copyfile.* - -$(OBJ)copyfile.com: $(OBJ)copyfile.hex $(LOAD) $(BINFILES) $(MK) - $(QUIET)$(LOAD) $(OBJ)copyfile - -$(OBJ)copyfile.hex: $(OBJ)copyfile.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)copyfile.ihx $(OBJ)copyfile.hex - -$(OBJ)copyfile.ihx: $(OBJ)copyfile.rel $(COMRELS) $(TMP)copyfile.arf $(MK) - $(QUIET)$(COPY) $(TMP)copyfile.arf $(TMP)copyfile.lnk - - $(QUIET)$(SDLD) $(LOPTS) -nf $(TMP)copyfile.lnk - $(QUIET)$(COPY) $(COPYFLG) copyfile.ihx obj - $(QUIET)$(COPY) $(COPYFLG) copyfile.map map - -############################################################## -# Dynamicaly create linker command file for copyfile utility # -# Now uses the macro controlled ECHO feature # -############################################################## -$(TMP)copyfile.arf: Makefile - $(ECHO) -mjx > $(TMP)copyfile.arf - $(ECHO) -i copyfile.ihx >> $(TMP)copyfile.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)copyfile.arf - $(ECHO) -l z80 >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cpm0.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)copyfile.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cpmbdos.rel >> $(TMP)copyfile.arf - $(ECHO) $(OBJ)cprintf.rel >> $(TMP)copyfile.arf - $(ECHO) -e >> $(TMP)copyfile.arf - -$(OBJ)copyfile.rel: $(SRC)copyfile.c $(MK) - $(QUIET)$(SDCC) $(SDCCFLG) $(SRC)copyfile.c - $(QUIET)$(COPY) copyfile.rel obj - $(QUIET)$(DEL) $(DELFLG) copyfile.rel -# ls obj - -#----------------------------------------------------------- - -# -# Use locally compiled 'load' command to covert Intel -# hex formal file to a binary CP/M-80 command file. -# -$(COM)fdisk.com: $(OBJ)fdisk.hex $(TOOLS) $(MK) - $(QUIET)$(BIN)load $(OBJ)fdisk - $(QUIET)$(COPY) $(COPYFLG) $(OBJ)fdisk.com com - $(QUIET)$(DEL) $(DELFLG) fdisk.* - -# -# rename 'ihx' output of linker to 'hex' - -$(OBJ)fdisk.hex: $(OBJ)fdisk.ihx $(MK) - $(QUIET)$(COPY) $(OBJ)fdisk.ihx $(OBJ)fdisk.hex - -$(OBJ)fdisk.ihx: $(OBJ)fdisk.rel $(TMP)fdisk.arf $(MK) - $(QUIET)$(COPY) $(TMP)fdisk.arf $(TMP)fdisk.lnk - $(QUIET)$(COPY) $(TMP)fdisk.arf $(TMP)fdisk.lk - $(QUIET)$(SDLD) $(SDLDFLG) -nf $(TMP)fdisk.lnk - $(QUIET)$(COPY) $(COPYFLG) fdisk.ihx $(OBJ)fdisk.ihx - $(QUIET)$(COPY) $(COPYFLG) fdisk.map map - -$(OBJ)fdisk.rel: $(SRC)fdisk.c $(INCFILES) $(MK) - $(QUIET)$(SDCC) -I inc $(SDCCFLG) $(SRC)fdisk.c - $(QUIET)$(COPY) $(COPYFLG) fdisk.rel $(OBJ) - -############################################################################ -# Dynamically created linker command file for fdisk utility (CP/M version) # -# Now uses macro controlled ECHO feature # -############################################################################ -$(TMP)fdisk.arf: $(MK) - $(ECHO) -mjx > $(TMP)fdisk.arf - $(ECHO) -i fdisk.ihx >> $(TMP)fdisk.arf - $(ECHO) -k $(SDCCLIB) >> $(TMP)fdisk.arf - $(ECHO) -l z80 >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cpm0.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)fdisk.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cpmbdos.rel >> $(TMP)fdisk.arf - $(ECHO) $(OBJ)cprintf.rel >> $(TMP)fdisk.arf - $(ECHO) -e >> $(TMP)fdisk.arf - - -#----------------------------------------------------------- - -# Also build host version of fdisk for testing purposes - -$(BIN)fdisk$(EXE): $(SRC)fdisk.c $(MK) - $(QUIET)$(TCC) $(TCCOPT) $(SRC)fdisk.c -o $(BIN)fdisk - -############################################################ - -# Build CP/M-80 Command File Structure Files - -$(OBJ)cpm0.rel: $(SRC)cpm0.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cpm0.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpm0.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpm0.lst $(LST) - -$(OBJ)cpmbdos.rel: $(SRC)cpmbdos.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cpmbdos.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpmbdos.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cpmbdos.lst $(LST) - -############################################################ - -# Build ROM Image structure files - -$(OBJ)crt0.rel: $(SRC)crt0.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0.lst $(LST) - -$(OBJ)crt0jplp.rel: $(SRC)crt0jplp.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0jplp.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0jplp.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0jplp.lst $(LST) - -$(OBJ)crt0scrm.rel: $(SRC)crt0scrm.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)crt0scrm.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0scrm.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)crt0scrm.lst $(LST) - - - -$(OBJ)bdosb01.rel: $(SRC)bdosb01.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)bdosb01.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)bdosb01.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)bdosb01.lst $(LST) - -$(OBJ)ccpb03.rel: $(SRC)ccpb03.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)ccpb03.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)ccpb03.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)ccpb03.lst $(LST) -# -# Assemble hardware control code for SBC V2 -# -$(OBJ)cbios.rel: $(SRC)cbios.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)cbios.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbios.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)cbios.lst $(LST) - -# -# Assemble a monitor program for the SBC V2 -# -$(OBJ)dbgmon.rel: $(SRC)dbgmon.s $(MK) - $(QUIET)$(SDAS) $(SDASFLG) $(SRC)dbgmon.s - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dbgmon.rel $(OBJ) - $(QUIET)$(COPY) $(COPYFLG) $(SRC)dbgmon.lst $(LST) - -########################################################### - -# Build host based tools ( dwgh2b, jrch2b, load, verify) - -$(DWGH2B): $(SRC)dwgh2b.c $(MK) - $(QUIET)$(TCC) $(TCCOPT) $(SRC)dwgh2b.c -o $(BIN)dwgh2b$(EXE) - -# -# Compile John Coffman's hex2bin program -# -$(JRCH2B): $(SRC)jrch2b.c $(MK) - $(QUIET)$(TCC) $(TCCOPT) $(SRC)jrch2b.c -o $(BIN)jrch2b$(EXE) -# $(QUIET)$(COPY) $(COPYFLG) $(BIN)jrch2b $(BIN)jrcb2h - -# -# Compile Doug's "load" program -# -$(LOAD): $(SRC)load.c $(MK) - $(QUIET)$(TCC) $(TCCOPT) $(SRC)load.c -o $(BIN)load$(EXE) - -$(SYSGEN): $(SRC)sysgen.c $(MK) - $(QUIET)$(TCC) $(TCCOPT) $(SRC)sysgen.c -o $(BIN)sysgen$(EXE) - -# -# Compile Doug's verif program that compares binary file regions -# -$(VERIFY): $(SRC)verify.c Makefile $(MK) - $(QUIET)$(TCC) $(TCCOPT) $(SRC)verify.c -o $(BIN)verify - -$(BIN)lechocr.exe: $(SRC)lechocr.c $(MK) -# $(QUIET)$(TCC) $(TCCOPT) $(SRC)lechocr.c -o $(BIN)lechocr - $(TCC) $(TCCOPT) $(SRC)lechocr.c -o lechocr.exe - $(COPY) lechocr.exe $(BIN) - -$(BIN)lecholf.exe: $(SRC)lecholf.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholf.c -o $(BIN)lecholf - $(TCC) $(TCCOPT) $(SRC)lecholf.c -o lecholf.exe - $(COPY) lecholf.exe $(BIN) - -$(BIN)lechocrlf.exe: $(SRC)lechocrlf.c $(MK) -# $(QUIET)$(TCC) $(TCCOPT) $(SRC)lechocrlf.c -o $(BIN)lechocrlf - $(TCC) $(TCCOPT) $(SRC)lechocrlf.c -o lechocrlf.exe - $(COPY) lechocrlf.exe $(BIN) - -$(BIN)lecholfcr.exe: $(SRC)lecholfcr.c $(MK) -# $(QUIET)$(TCC) $(TCCFLG) $(SRC)lecholfcr.c -o $(BIN)lecholfcr - $(TCC) $(TCCOPT) $(SRC)lecholfcr.c -o lecholfcr.exe - $(COPY) lecholfcr.exe $(BIN) - -############################################################ - -# Builder specific utility rules - -dwginstall: - $(COPY) $(COMFILES) ~/Documents/devobox/cdrive - -############################################################ - -# -# Delete all dynamically generated files that don't need to be -# saved. -# -clean: - $(QUIET)$(DEL) $(DELFLG) *.hex *.ihx *.lst *.rel *.rst *.lnk *.lk *.exe - $(QUIET)$(DEL) $(DELFLG) *.sym *.map *.noi *.asm *.com *.ini *.bin - $(QUIET)$(DEL) $(DELFLG) obj$(DELIM)*.* bin$(DELIM)*.* com$(DELIM)*.* rom$(DELIM)*.* tmp$(DELIM)*.* map$(DELIM)*.* lst$(DELIM)*.* - -################## -# eof - Makefile # -################## diff --git a/branches/dgg/cpurom/makexp.bat b/branches/dgg/cpurom/makexp.bat deleted file mode 100644 index 4040c97f..00000000 --- a/branches/dgg/cpurom/makexp.bat +++ /dev/null @@ -1,3 +0,0 @@ -wmake -f makefile.xp clean -wmake -f makefile.xp -dir rom diff --git a/branches/dgg/cpurom/ref/JRC0521.ZIP b/branches/dgg/cpurom/ref/JRC0521.ZIP deleted file mode 100644 index 55eb7806..00000000 Binary files a/branches/dgg/cpurom/ref/JRC0521.ZIP and /dev/null differ diff --git a/branches/dgg/cpurom/ref/bdosb01.asm b/branches/dgg/cpurom/ref/bdosb01.asm deleted file mode 100644 index b5883d94..00000000 --- a/branches/dgg/cpurom/ref/bdosb01.asm +++ /dev/null @@ -1,2587 +0,0 @@ - .title "Digital Research BDOS, Version 2.2" - .page 49 - -ENDFIL .EQU 1 ;FILL FULL BDOS LENGTH -; -IOBYTE: .EQU 3 ; I/O DEFINITION BYTE. -TDRIVE: .EQU 4 ; CURRENT DRIVE NAME AND USER NUMBER. -ENTRY: .EQU 5 ; ENTRY POINT FOR THE CP/M BDOS. -TFCB: .EQU 5CH ; DEFAULT FILE CONTROL BLOCK. -TBUFF: .EQU 80H ; I/O BUFFER AND COMMAND LINE STORAGE. -TBASE: .EQU 100H ; TRANSIANT PROGRAM STORAGE AREA. -; -; SET CONTROL CHARACTER .EQUATES. -; -CNTRLC: .EQU 3 ; CONTROL-C -CNTRLE: .EQU 05H ; CONTROL-E -BS: .EQU 08H ; BACKSPACE -TAB: .EQU 09H ; TAB -LF: .EQU 0AH ; LINE FEED -FF: .EQU 0CH ; FORM FEED -CR: .EQU 0DH ; CARRIAGE RETURN -CNTRLP: .EQU 10H ; CONTROL-P -CNTRLR: .EQU 12H ; CONTROL-R -CNTRLS: .EQU 13H ; CONTROL-S -CNTRLU: .EQU 15H ; CONTROL-U -CNTRLX: .EQU 18H ; CONTROL-X -CNTRLZ: .EQU 1AH ; CONTROL-Z (END-OF-FILE MARK) -DEL: .EQU 7FH ; RUBOUT - -; CPM ORIGIN CALCULATE - -NK .EQU 59 ;SYSTEM SIZE -BASE .EQU (NK*1024)-5000H -CCPO .EQU BASE+3400H ;CCP ORIGIN -BDOSO .EQU BASE+3C00H ;BDOS ORIGIN -BIOSO .EQU BASE+4A00H ;BIOS ORIGIN - - .ORG BDOSO - .DB 0,0,0,0,0,0 ;OLD SERIAL NUMBER -; -;************************************************************** -;* -;* B D O S E N T R Y -;* -;************************************************************** -; -FBASE: JP FBASE1 -; -; BDOS ERROR TABLE. -; -BADSCTR:.DW ERROR1 ; BAD SECTOR ON READ OR WRITE. -BADSLCT:.DW ERROR2 ; BAD DISK SELECT. -RODISK: .DW ERROR3 ; DISK IS READ ONLY. -ROFILE: .DW ERROR4 ; FILE IS READ ONLY. -; -; ENTRY INTO BDOS. (DE) OR (E) ARE THE PARAMETERS PASSED. THE -; FUNCTION NUMBER DESIRED IS IN REGISTER (C). -; E contains drive number if passing this -FBASE1: EX DE,HL ; SAVE THE (DE) PARAMETERS. - LD (PARAMS),HL - EX DE,HL - LD A,E ; AND SAVE REGISTER (E) IN PARTICULAR. - LD (EPARAM),A - LD HL,0 - LD (STATUS),HL ; CLEAR RETURN STATUS. - ADD HL,SP - LD (USRSTACK),HL ; SAVE USERS STACK POINTER. - LD SP,STKAREA ; AND SET OUR OWN. - XOR A ; CLEAR AUTO SELECT STORAGE SPACE. - LD (AUTOFLAG),A - LD (AUTO),A - LD HL,GOBACK ; SET RETURN ADDRESS. - PUSH HL - LD A,C ; GET FUNCTION NUMBER. - CP NFUNCTS ; VALID FUNCTION NUMBER? - RET NC - LD C,E ; KEEP SINGLE REGISTER FUNCTION HERE. - LD HL,FUNCTNS ; NOW LOOK THRU THE FUNCTION TABLE. - LD E,A - LD D,0 ; (DE)=FUNCTION NUMBER. - ADD HL,DE - ADD HL,DE ; (HL)=(START OF TABLE)+2*(FUNCTION NUMBER). - LD E,(HL) - INC HL - LD D,(HL) ; NOW (DE)=ADDRESS FOR THIS FUNCTION. - LD HL,(PARAMS) ; RETRIEVE PARAMETERS. - EX DE,HL ; NOW (DE) HAS THE ORIGINAL PARAMETERS. - JP (HL) ; EXECUTE DESIRED FUNCTION. -; -; BDOS FUNCTION JUMP TABLE. -; -NFUNCTS:.EQU 41 ; NUMBER OF FUNCTIONS IN FOLLOWIN TABLE. -; -FUNCTNS:.DW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB - .DW SETIOB,PRTSTR,R.DBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL - .DW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE - .DW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR - .DW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN - .DW RTN,WTSPECL -; -; BDOS ERROR MESSAGE SECTION. -; -ERROR1: LD HL,BADSEC ; BAD SECTOR MESSAGE. - CALL PRTERR ; PRINT IT AND GET A 1 CHAR RESPONCE. - CP CNTRLC ; RE-BOOT R.EQUEST (CONTROL-C)? - JP Z,0 ; YES. - RET ; NO, RETURN TO RETRY I/O FUNCTION. -; -ERROR2: LD HL,BADSEL ; BAD DRIVE SELECTED. - JP ERROR5 -; -ERROR3: LD HL,DISKRO ; DISK IS READ ONLY. - JP ERROR5 -; -ERROR4: LD HL,FILERO ; FILE IS READ ONLY. -; -ERROR5: CALL PRTERR - JP 0 ; ALWAYS REBOOT ON THESE ERRORS. -; -BDOSERR:.DB "BDOS ERR ON " -BDOSDRV:.DB " : $" -BADSEC: .DB "BAD SECTOR$" -BADSEL: .DB "SELECT$" -FILERO: .DB "FILE " -DISKRO: .DB "R/O$" -; -; PRINT BDOS ERROR MESSAGE. -; -PRTERR: PUSH HL ; SAVE SECOND MESSAGE POINTER. - CALL OUTCRLF ; SEND (CR)(LF). - LD A,(ACTIVE) ; GET ACTIVE DRIVE. - ADD A,'A' ; MAKE ASCII. - LD (BDOSDRV),A ; AND PUT IN MESSAGE. - LD BC,BDOSERR ; AND PRINT IT. - CALL PRTMESG - POP BC ; PRINT SECOND MESSAGE LINE NOW. - CALL PRTMESG -; -; GET AN INPUT CHARACTER. WE WILL CHECK OUR 1 CHARACTER -; BUFFER FIRST. THIS MAY BE SET BY THE CONSOLE STATUS ROUTINE. -; -GETCHAR:LD HL,CHARBUF ; CHECK CHARACTER BUFFER. - LD A,(HL) ; ANYTHING PRESENT ALREADY? - LD (HL),0 ; ...EITHER CASE CLEAR IT. - OR A - RET NZ ; YES, USE IT. - JP CONIN ; NOPE, GO GET A CHARACTER RESPONCE. -; -; INPUT AND ECHO A CHARACTER. -; -GETECHO:CALL GETCHAR ; INPUT A CHARACTER. - CALL CHKCHAR ; CARRIAGE CONTROL? - RET C ; NO, A REGULAR CONTROL CHAR SO DON'T ECHO. - PUSH AF ; OK, SAVE CHARACTER NOW. - LD C,A - CALL OUTCON ; AND ECHO IT. - POP AF ; GET CHARACTER AND RETURN. - RET -; -; CHECK CHARACTER IN (A). SET THE ZERO FLAG ON A CARRIAGE -; CONTROL CHARACTER AND THE CARRY FLAG ON ANY OTHER CONTROL -; CHARACTER. -; -CHKCHAR:CP CR ; CHECK FOR CARRIAGE RETURN, LINE FEED, BACKSPACE, - RET Z ; OR A TAB. - CP LF - RET Z - CP TAB - RET Z - CP BS - RET Z - CP ' ' ; OTHER CONTROL CHAR? SET CARRY FLAG. - RET -; -; CHECK THE CONSOLE DURING OUTPUT. HALT ON A CONTROL-S, THEN -; REBOOT ON A CONTROL-C. IF ANYTHING ELSE IS READY, CLEAR THE -; ZERO FLAG AND RETURN (THE CALLING ROUTINE MAY WANT TO DO -; SOMETHING). -; -CKCONSOL: - LD A,(CHARBUF) ; CHECK BUFFER. - OR A ; IF ANYTHING, JUST RETURN WITHOUT CHECKING. - JP NZ,CKCON2 - CALL CONST ; NOTHING IN BUFFER. CHECK CONSOLE. - AND 01H ; LOOK AT BIT 0. - RET Z ; RETURN IF NOTHING. - CALL CONIN ; OK, GET IT. - CP CNTRLS ; IF NOT CONTROL-S, RETURN WITH ZERO CLEARED. - JP NZ,CKCON1 - CALL CONIN ; HALT PROCESSING UNTIL ANOTHER CHAR - CP CNTRLC ; IS TYPED. CONTROL-C? - JP Z,0 ; YES, REBOOT NOW. - XOR A ; NO, JUST PRETEND NOTHING WAS EVER READY. - RET -CKCON1: LD (CHARBUF),A ; SAVE CHARACTER IN BUFFER FOR LATER PROCESSING. -CKCON2: LD A,1 ; SET (A) TO NON ZERO TO MEAN SOMETHING IS READY. - RET -; -; OUTPUT (C) TO THE SCREEN. IF THE PRINTER FLIP-FLOP FLAG -; IS SET, WE WILL SEND CHARACTER TO PRINTER ALSO. THE CONSOLE -; WILL BE CHECKED IN THE PROCESS. -; -OUTCHAR:LD A,(OUTFLAG) ; CHECK OUTPUT FLAG. - OR A ; ANYTHING AND WE WON'T GENERATE OUTPUT. - JP NZ,OUTCHR1 - PUSH BC - CALL CKCONSOL ; CHECK CONSOLE (WE DON'T CARE WHATS THERE). - POP BC - PUSH BC - CALL CONOUT ; OUTPUT (C) TO THE SCREEN. - POP BC - PUSH BC - LD A,(PRTFLAG) ; CHECK PRINTER FLIP-FLOP FLAG. - OR A - CALL NZ,LIST ; PRINT IT ALSO IF NON-ZERO. - POP BC -OUTCHR1:LD A,C ; UPDATE CURSORS POSITION. - LD HL,CURPOS - CP DEL ; RUBOUTS DON'T DO ANYTHING HERE. - RET Z - INC (HL) ; BUMP LINE POINTER. - CP ' ' ; AND RETURN IF A NORMAL CHARACTER. - RET NC - DEC (HL) ; RESTORE AND CHECK FOR THE START OF THE LINE. - LD A,(HL) - OR A - RET Z ; INGNORE CONTROL CHARACTERS AT THE START OF THE LINE. - LD A,C - CP BS ; IS IT A BACKSPACE? - JP NZ,OUTCHR2 - DEC (HL) ; YES, BACKUP POINTER. - RET -OUTCHR2:CP LF ; IS IT A LINE FEED? - RET NZ ; IGNORE ANYTHING ELSE. - LD (HL),0 ; RESET POINTER TO START OF LINE. - RET -; -; OUTPUT (A) TO THE SCREEN. IF IT IS A CONTROL CHARACTER -; (OTHER THAN CARRIAGE CONTROL), USE ^X FORMAT. -; -SHOWIT: LD A,C - CALL CHKCHAR ; CHECK CHARACTER. - JP NC,OUTCON ; NOT A CONTROL, USE NORMAL OUTPUT. - PUSH AF - LD C,'^' ; FOR A CONTROL CHARACTER, PRECEED IT WITH '^'. - CALL OUTCHAR - POP AF - OR '@' ; AND THEN USE THE LETTER .EQUIVELANT. - LD C,A -; -; FUNCTION TO OUTPUT (C) TO THE CONSOLE DEVICE AND EXPAND TABS -; IF NECESSARY. -; -OUTCON: LD A,C - CP TAB ; IS IT A TAB? - JP NZ,OUTCHAR ; USE REGULAR OUTPUT. -OUTCON1:LD C,' ' ; YES IT IS, USE SPACES INSTEAD. - CALL OUTCHAR - LD A,(CURPOS) ; GO UNTIL THE CURSOR IS AT A MULTIPLE OF 8 - - AND 07H ; POSITION. - JP NZ,OUTCON1 - RET -; -; ECHO A BACKSPACE CHARACTER. ERASE THE PREVOIUS CHARACTER -; ON THE SCREEN. -; -BACKUP: CALL BACKUP1 ; BACKUP THE SCREEN 1 PLACE. - LD C,' ' ; THEN BLANK THAT CHARACTER. - CALL CONOUT -BACKUP1:LD C,BS ; THEN BACK SPACE ONCE MORE. - JP CONOUT -; -; SIGNAL A DELETED LINE. PRINT A '#' AT THE END AND START -; OVER. -; -NEWLINE:LD C,'#' - CALL OUTCHAR ; PRINT THIS. - CALL OUTCRLF ; START NEW LINE. -NEWLN1: LD A,(CURPOS) ; MOVE THE CURSOR TO THE STARTING POSITION. - LD HL,STARTING - CP (HL) - RET NC ; THERE YET? - LD C,' ' - CALL OUTCHAR ; NOPE, KEEP GOING. - JP NEWLN1 -; -; OUTPUT A (CR) (LF) TO THE CONSOLE DEVICE (SCREEN). -; -OUTCRLF:LD C,CR - CALL OUTCHAR - LD C,LF - JP OUTCHAR -; -; PRINT MESSAGE POINTED TO BY (BC). IT WILL END WITH A '$'. -; -PRTMESG:LD A,(BC) ; CHECK FOR TERMINATING CHARACTER. - CP '$' - RET Z - INC BC - PUSH BC ; OTHERWISE, BUMP POINTER AND PRINT IT. - LD C,A - CALL OUTCON - POP BC - JP PRTMESG -; -; FUNCTION TO EXECUTE A BUFFERED READ. -; -R.DBUFF: LD A,(CURPOS) ; USE PRESENT LOCATION AS STARTING ONE. - LD (STARTING),A - LD HL,(PARAMS) ; GET THE MAXIMUM BUFFER SPACE. - LD C,(HL) - INC HL ; POINT TO FIRST AVAILABLE SPACE. - PUSH HL ; AND SAVE. - LD B,0 ; KEEP A CHARACTER COUNT. -R.DBUF1: PUSH BC - PUSH HL -R.DBUF2: CALL GETCHAR ; GET THE NEXT INPUT CHARACTER. - AND 7FH ; STRIP BIT 7. - POP HL ; RESET REGISTERS. - POP BC - CP CR ; EN OF THE LINE? - JP Z,R.DBUF17 - CP LF - JP Z,R.DBUF17 - CP BS ; HOW ABOUT A BACKSPACE? - JP NZ,R.DBUF3 - LD A,B ; YES, BUT IGNORE AT THE BEGINNING OF THE LINE. - OR A - JP Z,R.DBUF1 - DEC B ; OK, UPDATE COUNTER. - LD A,(CURPOS) ; IF WE BACKSPACE TO THE START OF THE LINE, - LD (OUTFLAG),A ; TREAT AS A CANCEL (CONTROL-X). - JP R.DBUF10 -R.DBUF3: CP DEL ; USER TYPED A RUBOUT? - JP NZ,R.DBUF4 - LD A,B ; IGNORE AT THE START OF THE LINE. - OR A - JP Z,R.DBUF1 - LD A,(HL) ; OK, ECHO THE PREVOIUS CHARACTER. - DEC B ; AND RESET POINTERS (COUNTERS). - DEC HL - JP R.DBUF15 -R.DBUF4: CP CNTRLE ; PHYSICAL END OF LINE? - JP NZ,R.DBUF5 - PUSH BC ; YES, DO IT. - PUSH HL - CALL OUTCRLF - XOR A ; AND UPDATE STARTING POSITION. - LD (STARTING),A - JP R.DBUF2 -R.DBUF5: CP CNTRLP ; CONTROL-P? - JP NZ,R.DBUF6 - PUSH HL ; YES, FLIP THE PRINT FLAG FILP-FLOP BYTE. - LD HL,PRTFLAG - LD A,1 ; PRTFLAG=1-PRTFLAG - SUB (HL) - LD (HL),A - POP HL - JP R.DBUF1 -R.DBUF6: CP CNTRLX ; CONTROL-X (CANCEL)? - JP NZ,R.DBUF8 - POP HL -R.DBUF7: LD A,(STARTING) ; YES, BACKUP THE CURSOR TO HERE. - LD HL,CURPOS - CP (HL) - JP NC,R.DBUFF ; DONE YET? - DEC (HL) ; NO, DECREMENT POINTER AND OUTPUT BACK UP ONE SPACE. - CALL BACKUP - JP R.DBUF7 -R.DBUF8: CP CNTRLU ; CNTROL-U (CANCEL LINE)? - JP NZ,R.DBUF9 - CALL NEWLINE ; START A NEW LINE. - POP HL - JP R.DBUFF -R.DBUF9: CP CNTRLR ; CONTROL-R? - JP NZ,R.DBUF14 -R.DBUF10:PUSH BC ; YES, START A NEW LINE AND RETYPE THE OLD ONE. - CALL NEWLINE - POP BC - POP HL - PUSH HL - PUSH BC -R.DBUF11:LD A,B ; DONE WHOLE LINE YET? - OR A - JP Z,R.DBUF12 - INC HL ; NOPE, GET NEXT CHARACTER. - LD C,(HL) - DEC B ; COUNT IT. - PUSH BC - PUSH HL - CALL SHOWIT ; AND DISPLAY IT. - POP HL - POP BC - JP R.DBUF11 -R.DBUF12:PUSH HL ; DONE WITH LINE. IF WE WERE DISPLAYING - LD A,(OUTFLAG) ; THEN UPDATE CURSOR POSITION. - OR A - JP Z,R.DBUF2 - LD HL,CURPOS ; BECAUSE THIS LINE IS SHORTER, WE MUST - SUB (HL) ; BACK UP THE CURSOR (NOT THE SCREEN HOWEVER) - LD (OUTFLAG),A ; SOME NUMBER OF POSITIONS. -R.DBUF13:CALL BACKUP ; NOTE THAT AS LONG AS (OUTFLAG) IS NON - LD HL,OUTFLAG ; ZERO, THE SCREEN WILL NOT BE CHANGED. - DEC (HL) - JP NZ,R.DBUF13 - JP R.DBUF2 ; NOW JUST GET THE NEXT CHARACTER. -; -; JUST A NORMAL CHARACTER, PUT THIS IN OUR BUFFER AND ECHO. -; -R.DBUF14:INC HL - LD (HL),A ; STORE CHARACTER. - INC B ; AND COUNT IT. -R.DBUF15:PUSH BC - PUSH HL - LD C,A ; ECHO IT NOW. - CALL SHOWIT - POP HL - POP BC - LD A,(HL) ; WAS IT AN ABORT R.EQUEST? - CP CNTRLC ; CONTROL-C ABORT? - LD A,B - JP NZ,R.DBUF16 - CP 1 ; ONLY IF AT START OF LINE. - JP Z,0 -R.DBUF16:CP C ; NOPE, HAVE WE FILLED THE BUFFER? - JP C,R.DBUF1 -R.DBUF17:POP HL ; YES END THE LINE AND RETURN. - LD (HL),B - LD C,CR - JP OUTCHAR ; OUTPUT (CR) AND RETURN. -; -; FUNCTION TO GET A CHARACTER FROM THE CONSOLE DEVICE. -; -GETCON: CALL GETECHO ; GET AND ECHO. - JP SETSTAT ; SAVE STATUS AND RETURN. -; -; FUNCTION TO GET A CHARACTER FROM THE TAPE READER DEVICE. -; -GETRDR: CALL READER ; GET A CHARACTER FROM READER, SET STATUS AND RETURN. - JP SETSTAT -; -; FUNCTION TO PERFORM DIRECT CONSOLE I/O. IF (C) CONTAINS (FF) -; THEN THIS IS AN INPUT R.EQUEST. IF (C) CONTAINS (FE) THEN -; THIS IS A STATUS R.EQUEST. OTHERWISE WE ARE TO OUTPUT (C). -; -DIRCIO: LD A,C ; TEST FOR (FF). - INC A - JP Z,DIRC1 - INC A ; TEST FOR (FE). - JP Z,CONST - JP CONOUT ; JUST OUTPUT (C). -DIRC1: CALL CONST ; THIS IS AN INPUT R.EQUEST. - OR A - JP Z,GOBACK1 ; NOT READY? JUST RETURN (DIRECTLY). - CALL CONIN ; YES, GET CHARACTER. - JP SETSTAT ; SET STATUS AND RETURN. -; -; FUNCTION TO RETURN THE I/O BYTE. -; -GETIOB: LD A,(IOBYTE) - JP SETSTAT -; -; FUNCTION TO SET THE I/O BYTE. -; -SETIOB: LD HL,IOBYTE - LD (HL),C - RET -; -; FUNCTION TO PRINT THE CHARACTER STRING POINTED TO BY (DE) -; ON THE CONSOLE DEVICE. THE STRING ENDS WITH A '$'. -; -PRTSTR: EX DE,HL - LD C,L - LD B,H ; NOW (BC) POINTS TO IT. - JP PRTMESG -; -; FUNCTION TO INTERIGATE THE CONSOLE DEVICE. -; -GETCSTS:CALL CKCONSOL -; -; GET HERE TO SET THE STATUS AND RETURN TO THE CLEANUP -; SECTION. THEN BACK TO THE USER. -; -SETSTAT:LD (STATUS),A -RTN: RET -; -; SET THE STATUS TO 1 (READ OR WRITE ERROR CODE). -; -IOERR1: LD A,1 - JP SETSTAT -; -OUTFLAG:.DB 0 ; OUTPUT FLAG (NON ZERO MEANS NO OUTPUT). -STARTING: - .DB 2 ; STARTING POSITION FOR CURSOR. -CURPOS: .DB 0 ; CURSOR POSITION (0=START OF LINE). -PRTFLAG:.DB 0 ; PRINTER FLAG (CONTROL-P TOGGLE). LIST IF NON ZERO. -CHARBUF:.DB 0 ; SINGLE INPUT CHARACTER BUFFER. -; -; STACK AREA FOR BDOS CALLS. -; -USRSTACK: - .DW 0 ; SAVE USERS STACK POINTER HERE. -; - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -STKAREA:.EQU $ ; END OF STACK AREA. -; -USERNO: .DB 0 ; CURRENT USER NUMBER. -ACTIVE: .DB 0 ; CURRENTLY ACTIVE DRIVE. -PARAMS: .DW 0 ; SAVE (DE) PARAMETERS HERE ON ENTRY. -STATUS: .DW 0 ; STATUS RETURNED FROM BDOS FUNCTION. -; -; SELECT ERROR OCCURED, JUMP TO ERROR ROUTINE. -; -SLCTERR:LD HL,BADSLCT -; -; JUMP TO (HL) INDIRECTLY. -; -JUMPHL: LD E,(HL) - INC HL - LD D,(HL) ; NOW (DE) CONTAIN THE DESIRED ADDRESS. - EX DE,HL - JP (HL) -; -; BLOCK MOVE. (DE) TO (HL), (C) BYTES TOTAL. -; -DE2HL: INC C ; IS COUNT DOWN TO ZERO? -DE2HL1: DEC C - RET Z ; YES, WE ARE DONE. - LD A,(DE) ; NO, MOVE ONE MORE BYTE. - LD (HL),A - INC DE - INC HL - JP DE2HL1 ; AND REPEAT. -; -; SELECT THE DESIRED DRIVE. -; -SELECT: LD A,(ACTIVE) ; GET ACTIVE DISK. - LD C,A - CALL SELDSK ; SELECT IT. - LD A,H ; VALID DRIVE? - OR L ; VALID DRIVE? - RET Z ; RETURN IF NOT. -; -; HERE, THE BIOS RETURNED THE ADDRESS OF THE PARAMETER BLOCK -; IN (HL). WE WILL EXTRACT THE NECESSARY POINTERS AND SAVE THEM. -; - LD E,(HL) ; YES, GET ADDRESS OF TRANSLATION TABLE INTO (DE). - INC HL - LD D,(HL) - INC HL - LD (SCRATCH1),HL ; SAVE POINTERS TO SCRATCH AREAS. - INC HL - INC HL - LD (SCRATCH2),HL ; DITTO. - INC HL - INC HL - LD (SCRATCH3),HL ; DITTO. - INC HL - INC HL - EX DE,HL ; NOW SAVE THE TRANSLATION TABLE ADDRESS. - LD (XLATE),HL - LD HL,DIRBUF ; PUT THE NEXT 8 BYTES HERE. - LD C,8 ; THEY CONSIST OF THE DIRECTORY BUFFER - CALL DE2HL ; POINTER, PARAMETER BLOCK POINTER, - LD HL,(DISKPB) ; CHECK AND ALLOCATION VECTORS. - EX DE,HL - LD HL,SECTORS ; MOVE PARAMETER BLOCK INTO OUR RAM. - LD C,15 ; IT IS 15 BYTES LONG. - CALL DE2HL - LD HL,(DSKSIZE) ; CHECK DISK SIZE. - LD A,H ; MORE THAN 256 BLOCKS ON THIS? - LD HL,BIGDISK - LD (HL),0FFH ; SET TO SAMLL. - OR A - JP Z,SELECT1 - LD (HL),0 ; WRONG, SET TO LARGE. -SELECT1:LD A,0FFH ; CLEAR THE ZERO FLAG. - OR A - RET -; -; ROUTINE TO HOME THE DISK TRACK HEAD AND CLEAR POINTERS. -; -HOMEDRV:CALL HOME ; HOME THE HEAD. - XOR A - LD HL,(SCRATCH2) ; SET OUR TRACK POINTER ALSO. - LD (HL),A - INC HL - LD (HL),A - LD HL,(SCRATCH3) ; AND OUR SECTOR POINTER. - LD (HL),A - INC HL - LD (HL),A - RET -; -; DO THE ACTUAL DISK READ AND CHECK THE ERROR RETURN STATUS. -; -DOREAD: CALL READ - JP IORET -; -; DO THE ACTUAL DISK WRITE AND HANDLE ANY BIOS ERROR. -; -DOWRITE:CALL WRITE -IORET: OR A - RET Z ; RETURN UNLESS AN ERROR OCCURED. - LD HL,BADSCTR ; BAD READ/WRITE ON THIS SECTOR. - JP JUMPHL -; -; ROUTINE TO SELECT THE TRACK AND SECTOR THAT THE DESIRED -; BLOCK NUMBER FALLS IN. -; -TRKSEC: LD HL,(FILEPOS) ; GET POSITION OF LAST ACCESSED FILE - LD C,2 ; IN DIRECTORY AND COMPUTE SECTOR #. - CALL SHIFTR ; SECTOR #=FILE-POSITION/4. - LD (BLKNMBR),HL ; SAVE THIS AS THE BLOCK NUMBER OF INTEREST. - LD (CKSUMTBL),HL ; WHAT'S IT DOING HERE TOO? -; -; IF THE SECTOR NUMBER HAS ALREADY BEEN SET (BLKNMBR), ENTER -; AT THIS POINT. -; -TRKSEC1:LD HL,BLKNMBR - LD C,(HL) ; MOVE SECTOR NUMBER INTO (BC). - INC HL - LD B,(HL) - LD HL,(SCRATCH3) ; GET CURRENT SECTOR NUMBER AND - LD E,(HL) ; MOVE THIS INTO (DE). - INC HL - LD D,(HL) - LD HL,(SCRATCH2) ; GET CURRENT TRACK NUMBER. - LD A,(HL) ; AND THIS INTO (HL). - INC HL - LD H,(HL) - LD L,A -TRKSEC2:LD A,C ; IS DESIRED SECTOR BEFORE CURRENT ONE? - SUB E - LD A,B - SBC A,D - JP NC,TRKSEC3 - PUSH HL ; YES, DECREMENT SECTORS BY ONE TRACK. - LD HL,(SECTORS) ; GET SECTORS PER TRACK. - LD A,E - SUB L - LD E,A - LD A,D - SBC A,H - LD D,A ; NOW WE HAVE BACKED UP ONE FULL TRACK. - POP HL - DEC HL ; ADJUST TRACK COUNTER. - JP TRKSEC2 -TRKSEC3:PUSH HL ; DESIRED SECTOR IS AFTER CURRENT ONE. - LD HL,(SECTORS) ; GET SECTORS PER TRACK. - ADD HL,DE ; BUMP SECTOR POINTER TO NEXT TRACK. - JP C,TRKSEC4 - LD A,C ; IS DESIRED SECTOR NOW BEFORE CURRENT ONE? - SUB L - LD A,B - SBC A,H - JP C,TRKSEC4 - EX DE,HL ; NOT YES, INCREMENT TRACK COUNTER - POP HL ; AND CONTINUE UNTIL IT IS. - INC HL - JP TRKSEC3 -; -; HERE WE HAVE DETERMINED THE TRACK NUMBER THAT CONTAINS THE -; DESIRED SECTOR. -; -TRKSEC4:POP HL ; GET TRACK NUMBER (HL). - PUSH BC - PUSH DE - PUSH HL - EX DE,HL - LD HL,(OFFSET) ; ADJUST FOR FIRST TRACK OFFSET. - ADD HL,DE - LD B,H - LD C,L - CALL SETTRK ; SELECT THIS TRACK. - POP DE ; RESET CURRENT TRACK POINTER. - LD HL,(SCRATCH2) - LD (HL),E - INC HL - LD (HL),D - POP DE - LD HL,(SCRATCH3) ; RESET THE FIRST SECTOR ON THIS TRACK. - LD (HL),E - INC HL - LD (HL),D - POP BC - LD A,C ; NOW SUBTRACT THE DESIRED ONE. - SUB E ; TO MAKE IT RELATIVE (1-# SECTORS/TRACK). - LD C,A - LD A,B - SBC A,D - LD B,A - LD HL,(XLATE) ; TRANSLATE THIS SECTOR ACCORDING TO THIS TABLE. - EX DE,HL - CALL SECTRN ; LET THE BIOS TRANSLATE IT. - LD C,L - LD B,H - JP SETSEC ; AND SELECT IT. -; -; COMPUTE BLOCK NUMBER FROM RECORD NUMBER (SAVNREC) AND -; EXTENT NUMBER (SAVEXT). -; -GETBLOCK: - LD HL,BLKSHFT ; GET LOGICAL TO PHYSICAL CONVERSION. - LD C,(HL) ; NOTE THAT THIS IS BASE 2 LOG OF RATIO. - LD A,(SAVNREC) ; GET RECORD NUMBER. -GETBLK1:OR A ; COMPUTE (A)=(A)/2^BLKSHFT. - RRA - DEC C - JP NZ,GETBLK1 - LD B,A ; SAVE RESULT IN (B). - LD A,8 - SUB (HL) - LD C,A ; COMPUTE (C)=8-BLKSHFT. - LD A,(SAVEXT) -GETBLK2:DEC C ; COMPUTE (A)=SAVEXT*2^(8-BLKSHFT). - JP Z,GETBLK3 - OR A - RLA - JP GETBLK2 -GETBLK3:ADD A,B - RET -; -; ROUTINE TO EXTRACT THE (BC) BLOCK BYTE FROM THE FCB POINTED -; TO BY (PARAMS). IF THIS IS A BIG-DISK, THEN THESE ARE 16 BIT -; BLOCK NUMBERS, ELSE THEY ARE 8 BIT NUMBERS. -; NUMBER IS RETURNED IN (HL). -; -EXTBLK: LD HL,(PARAMS) ; GET FCB ADDRESS. - LD DE,16 ; BLOCK NUMBERS START 16 BYTES INTO FCB. - ADD HL,DE - ADD HL,BC - LD A,(BIGDISK) ; ARE WE USING A BIG-DISK? - OR A - JP Z,EXTBLK1 - LD L,(HL) ; NO, EXTRACT AN 8 BIT NUMBER FROM THE FCB. - LD H,0 - RET -EXTBLK1:ADD HL,BC ; YES, EXTRACT A 16 BIT NUMBER. - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL ; RETURN IN (HL). - RET -; -; COMPUTE BLOCK NUMBER. -; -COMBLK: CALL GETBLOCK - LD C,A - LD B,0 - CALL EXTBLK - LD (BLKNMBR),HL - RET -; -; CHECK FOR A ZERO BLOCK NUMBER (UNUSED). -; -CHKBLK: LD HL,(BLKNMBR) - LD A,L ; IS IT ZERO? - OR H - RET -; -; ADJUST PHYSICAL BLOCK (BLKNMBR) AND CONVERT TO LOGICAL -; SECTOR (LOGSECT). THIS IS THE STARTING SECTOR OF THIS BLOCK. -; THE ACTUAL SECTOR OF INTEREST IS THEN ADDED TO THIS AND THE -; RESULTING SECTOR NUMBER IS STORED BACK IN (BLKNMBR). THIS -; WILL STILL HAVE TO BE ADJUSTED FOR THE TRACK NUMBER. -; -LOGICAL:LD A,(BLKSHFT) ; GET LOG2(PHYSICAL/LOGICAL SECTORS). - LD HL,(BLKNMBR) ; GET PHYSICAL SECTOR DESIRED. -LOGICL1:ADD HL,HL ; COMPUTE LOGICAL SECTOR NUMBER. - DEC A ; NOTE LOGICAL SECTORS ARE 128 BYTES LONG. - JP NZ,LOGICL1 - LD (LOGSECT),HL ; SAVE LOGICAL SECTOR. - LD A,(BLKMASK) ; GET BLOCK MASK. - LD C,A - LD A,(SAVNREC) ; GET NEXT SECTOR TO ACCESS. - AND C ; EXTRACT THE RELATIVE POSITION WITHIN PHYSICAL BLOCK. - OR L ; AND ADD IT TOO LOGICAL SECTOR. - LD L,A - LD (BLKNMBR),HL ; AND STORE. - RET -; -; SET (HL) TO POINT TO EXTENT BYTE IN FCB. -; -SETEXT: LD HL,(PARAMS) - LD DE,12 ; IT IS THE TWELTH BYTE. - ADD HL,DE - RET -; -; SET (HL) TO POINT TO RECORD COUNT BYTE IN FCB AND (DE) TO -; NEXT RECORD NUMBER BYTE. -; -SETHLDE:LD HL,(PARAMS) - LD DE,15 ; RECORD COUNT BYTE (#15). - ADD HL,DE - EX DE,HL - LD HL,17 ; NEXT RECORD NUMBER (#32). - ADD HL,DE - RET -; -; SAVE CURRENT FILE DATA FROM FCB. -; -STRDATA:CALL SETHLDE - LD A,(HL) ; GET AND STORE RECORD COUNT BYTE. - LD (SAVNREC),A - EX DE,HL - LD A,(HL) ; GET AND STORE NEXT RECORD NUMBER BYTE. - LD (SAVNXT),A - CALL SETEXT ; POINT TO EXTENT BYTE. - LD A,(EXTMASK) ; GET EXTENT MASK. - AND (HL) - LD (SAVEXT),A ; AND SAVE EXTENT HERE. - RET -; -; SET THE NEXT RECORD TO ACCESS. IF (MODE) IS SET TO 2, THEN -; THE LAST RECORD BYTE (SAVNREC) HAS THE CORRECT NUMBER TO ACCESS. -; FOR S.EQUENTIAL ACCESS, (MODE) WILL BE .EQUAL TO 1. -; -SETNREC:CALL SETHLDE - LD A,(MODE) ; GET S.EQUENTIAL FLAG (=1). - CP 2 ; A 2 INDICATES THAT NO ADDER IS NEEDED. - JP NZ,STNREC1 - XOR A ; CLEAR ADDER (RANDOM ACCESS?). -STNREC1:LD C,A - LD A,(SAVNREC) ; GET LAST RECORD NUMBER. - ADD A,C ; INCREMENT RECORD COUNT. - LD (HL),A ; AND SET FCB'S NEXT RECORD BYTE. - EX DE,HL - LD A,(SAVNXT) ; GET NEXT RECORD BYTE FROM STORAGE. - LD (HL),A ; AND PUT THIS INTO FCB AS NUMBER OF RECORDS USED. - RET -; -; SHIFT (HL) RIGHT (C) BITS. -; -SHIFTR: INC C -SHIFTR1:DEC C - RET Z - LD A,H - OR A - RRA - LD H,A - LD A,L - RRA - LD L,A - JP SHIFTR1 -; -; COMPUTE THE CHECK-SUM FOR THE DIRECTORY BUFFER. RETURN -; INTEGER SUM IN (A). -; -CHECKSUM: - LD C,128 ; LENGTH OF BUFFER. - LD HL,(DIRBUF) ; GET ITS LOCATION. - XOR A ; CLEAR SUMMATION BYTE. -CHKSUM1:ADD A,(HL) ; AND COMPUTE SUM IGNORING CARRIES. - INC HL - DEC C - JP NZ,CHKSUM1 - RET -; -; SHIFT (HL) LEFT (C) BITS. -; -SHIFTL: INC C -SHIFTL1:DEC C - RET Z - ADD HL,HL ; SHIFT LEFT 1 BIT. - JP SHIFTL1 -; -; ROUTINE TO SET A BIT IN A 16 BIT VALUE CONTAINED IN (BC). -; THE BIT SET DEPENDS ON THE CURRENT DRIVE SELECTION. -; -SETBIT: PUSH BC ; SAVE 16 BIT WORD. - LD A,(ACTIVE) ; GET ACTIVE DRIVE. - LD C,A - LD HL,1 - CALL SHIFTL ; SHIFT BIT 0 INTO PLACE. - POP BC ; NOW 'OR' THIS WITH THE ORIGINAL WORD. - LD A,C - OR L - LD L,A ; LOW BYTE DONE, DO HIGH BYTE. - LD A,B - OR H - LD H,A - RET -; -; EXTRACT THE WRITE PROTECT STATUS BIT FOR THE CURRENT DRIVE. -; THE RESULT IS RETURNED IN (A), BIT 0. -; -GETWPRT:LD HL,(WRTPRT) ; GET STATUS BYTES. - LD A,(ACTIVE) ; WHICH DRIVE IS CURRENT? - LD C,A - CALL SHIFTR ; SHIFT STATUS SUCH THAT BIT 0 IS THE - LD A,L ; ONE OF INTEREST FOR THIS DRIVE. - AND 01H ; AND ISOLATE IT. - RET -; -; FUNCTION TO WRITE PROTECT THE CURRENT DISK. -; -WRTPRTD:LD HL,WRTPRT ; POINT TO STATUS WORD. - LD C,(HL) ; SET (BC) .EQUAL TO THE STATUS. - INC HL - LD B,(HL) - CALL SETBIT ; AND SET THIS BIT ACCORDING TO CURRENT DRIVE. - LD (WRTPRT),HL ; THEN SAVE. - LD HL,(DIRSIZE) ; NOW SAVE DIRECTORY SIZE LIMIT. - INC HL ; REMEMBER THE LAST ONE. - EX DE,HL - LD HL,(SCRATCH1) ; AND STORE IT HERE. - LD (HL),E ; PUT LOW BYTE. - INC HL - LD (HL),D ; THEN HIGH BYTE. - RET -; -; CHECK FOR A READ ONLY FILE. -; -CHKROFL:CALL FCB2HL ; SET (HL) TO FILE ENTRY IN DIRECTORY BUFFER. -CKROF1: LD DE,9 ; LOOK AT BIT 7 OF THE NINTH BYTE. - ADD HL,DE - LD A,(HL) - RLA - RET NC ; RETURN IF OK. - LD HL,ROFILE ; ELSE, PRINT ERROR MESSAGE AND TERMINATE. - JP JUMPHL -; -; CHECK THE WRITE PROTECT STATUS OF THE ACTIVE DISK. -; -CHKWPRT:CALL GETWPRT - RET Z ; RETURN IF OK. - LD HL,RODISK ; ELSE PRINT MESSAGE AND TERMINATE. - JP JUMPHL -; -; ROUTINE TO SET (HL) POINTING TO THE PROPER ENTRY IN THE -; DIRECTORY BUFFER. -; -FCB2HL: LD HL,(DIRBUF) ; GET ADDRESS OF BUFFER. - LD A,(FCBPOS) ; RELATIVE POSITION OF FILE. -; -; ROUTINE TO ADD (A) TO (HL). -; -ADDA2HL:ADD A,L - LD L,A - RET NC - INC H ; TAKE CARE OF ANY CARRY. - RET -; -; ROUTINE TO GET THE 'S2' BYTE FROM THE FCB SUPPLIED IN -; THE INITIAL PARAMETER SPECIFICATION. -; -GETS2: LD HL,(PARAMS) ; GET ADDRESS OF FCB. - LD DE,14 ; RELATIVE POSITION OF 'S2'. - ADD HL,DE - LD A,(HL) ; EXTRACT THIS BYTE. - RET -; -; CLEAR THE 'S2' BYTE IN THE FCB. -; -CLEARS2:CALL GETS2 ; THIS SETS (HL) POINTING TO IT. - LD (HL),0 ; NOW CLEAR IT. - RET -; -; SET BIT 7 IN THE 'S2' BYTE OF THE FCB. -; -SETS2B7:CALL GETS2 ; GET THE BYTE. - OR 80H ; AND SET BIT 7. - LD (HL),A ; THEN STORE. - RET -; -; COMPARE (FILEPOS) WITH (SCRATCH1) AND SET FLAGS BASED ON -; THE DIFFERENCE. THIS CHECKS TO SEE IF THERE ARE MORE FILE -; NAMES IN THE DIRECTORY. WE ARE AT (FILEPOS) AND THERE ARE -; (SCRATCH1) OF THEM TO CHECK. -; -MOREFLS:LD HL,(FILEPOS) ; WE ARE HERE. - EX DE,HL - LD HL,(SCRATCH1) ; AND DON'T GO PAST HERE. - LD A,E ; COMPUTE DIFFERENCE BUT DON'T KEEP. - SUB (HL) - INC HL - LD A,D - SBC A,(HL) ; SET CARRY IF NO MORE NAMES. - RET -; -; CALL THIS ROUTINE TO PREVENT (SCRATCH1) FROM BEING GREATER -; THAN (FILEPOS). -; -CHKNMBR:CALL MOREFLS ; SCRATCH1 TOO BIG? - RET C - INC DE ; YES, RESET IT TO (FILEPOS). - LD (HL),D - DEC HL - LD (HL),E - RET -; -; COMPUTE (HL)=(DE)-(HL) -; -SUBHL: LD A,E ; COMPUTE DIFFERENCE. - SUB L - LD L,A ; STORE LOW BYTE. - LD A,D - SBC A,H - LD H,A ; AND THEN HIGH BYTE. - RET -; -; SET THE DIRECTORY CHECKSUM BYTE. -; -SETDIR: LD C,0FFH -; -; ROUTINE TO SET OR COMPARE THE DIRECTORY CHECKSUM BYTE. IF -; (C)=0FFH, THEN THIS WILL SET THE CHECKSUM BYTE. ELSE THE BYTE -; WILL BE CHECKED. IF THE CHECK FAILS (THE DISK HAS BEEN CHANGED), -; THEN THIS DISK WILL BE WRITE PROTECTED. -; -CHECKDIR: - LD HL,(CKSUMTBL) - EX DE,HL - LD HL,(ALLOC1) - CALL SUBHL - RET NC ; OK IF (CKSUMTBL) > (ALLOC1), SO RETURN. - PUSH BC - CALL CHECKSUM ; ELSE COMPUTE CHECKSUM. - LD HL,(CHKVECT) ; GET ADDRESS OF CHECKSUM TABLE. - EX DE,HL - LD HL,(CKSUMTBL) - ADD HL,DE ; SET (HL) TO POINT TO BYTE FOR THIS DRIVE. - POP BC - INC C ; SET OR CHECK ? - JP Z,CHKDIR1 - CP (HL) ; CHECK THEM. - RET Z ; RETURN IF THEY ARE THE SAME. - CALL MOREFLS ; NOT THE SAME, DO WE CARE? - RET NC - CALL WRTPRTD ; YES, MARK THIS AS WRITE PROTECTED. - RET -CHKDIR1:LD (HL),A ; JUST SET THE BYTE. - RET -; -; DO A WRITE TO THE DIRECTORY OF THE CURRENT DISK. -; -DIRWRITE: - CALL SETDIR ; SET CHECKSUM BYTE. - CALL DIRDMA ; SET DIRECTORY DMA ADDRESS. - LD C,1 ; TELL THE BIOS TO ACTUALLY WRITE. - CALL DOWRITE ; THEN DO THE WRITE. - JP DEFDMA -; -; READ FROM THE DIRECTORY. -; -DIRREAD:CALL DIRDMA ; SET THE DIRECTORY DMA ADDRESS. - CALL DOREAD ; AND READ IT. -; -; ROUTINE TO SET THE DMA ADDRESS TO THE USERS CHOICE. -; -DEFDMA: LD HL,USERDMA ; RESET THE DEFAULT DMA ADDRESS AND RETURN. - JP DIRDMA1 -; -; ROUTINE TO SET THE DMA ADDRESS FOR DIRECTORY WORK. -; -DIRDMA: LD HL,DIRBUF -; -; SET THE DMA ADDRESS. ON ENTRY, (HL) POINTS TO -; WORD CONTAINING THE DESIRED DMA ADDRESS. -; -DIRDMA1:LD C,(HL) - INC HL - LD B,(HL) ; SETUP (BC) AND GO TO THE BIOS TO SET IT. - JP SETDMA -; -; MOVE THE DIRECTORY BUFFER INTO USER'S DMA SPACE. -; -MOVEDIR:LD HL,(DIRBUF) ; BUFFER IS LOCATED HERE, AND - EX DE,HL - LD HL,(USERDMA) ; PUT IT HERE. - LD C,128 ; THIS IS ITS LENGTH. - JP DE2HL ; MOVE IT NOW AND RETURN. -; -; CHECK (FILEPOS) AND SET THE ZERO FLAG IF IT .EQUALS 0FFFFH. -; -CKFILPOS: - LD HL,FILEPOS - LD A,(HL) - INC HL - CP (HL) ; ARE BOTH BYTES THE SAME? - RET NZ - INC A ; YES, BUT ARE THEY EACH 0FFH? - RET -; -; SET LOCATION (FILEPOS) TO 0FFFFH. -; -STFILPOS: - LD HL,0FFFFH - LD (FILEPOS),HL - RET -; -; MOVE ON TO THE NEXT FILE POSITION WITHIN THE CURRENT -; DIRECTORY BUFFER. IF NO MORE EXIST, SET POINTER TO 0FFFFH -; AND THE CALLING ROUTINE WILL CHECK FOR THIS. ENTER WITH (C) -; .EQUAL TO 0FFH TO CAUSE THE CHECKSUM BYTE TO BE SET, ELSE WE -; WILL CHECK THIS DISK AND SET WRITE PROTECT IF CHECKSUMS ARE -; NOT THE SAME (APPLIES ONLY IF ANOTHER DIRECTORY SECTOR MUST -; BE READ). -; -NXENTRY:LD HL,(DIRSIZE) ; GET DIRECTORY ENTRY SIZE LIMIT. - EX DE,HL - LD HL,(FILEPOS) ; GET CURRENT COUNT. - INC HL ; GO ON TO THE NEXT ONE. - LD (FILEPOS),HL - CALL SUBHL ; (HL)=(DIRSIZE)-(FILEPOS) - JP NC,NXENT1 ; IS THERE MORE ROOM LEFT? - JP STFILPOS ; NO. SET THIS FLAG AND RETURN. -NXENT1: LD A,(FILEPOS) ; GET FILE POSITION WITHIN DIRECTORY. - AND 03H ; ONLY LOOK WITHIN THIS SECTOR (ONLY 4 ENTRIES FIT). - LD B,5 ; CONVERT TO RELATIVE POSITION (32 BYTES EACH). -NXENT2: ADD A,A ; NOTE THAT THIS IS NOT EFFICIENT CODE. - DEC B ; 5 'ADD A'S WOULD BE BETTER. - JP NZ,NXENT2 - LD (FCBPOS),A ; SAVE IT AS POSITION OF FCB. - OR A - RET NZ ; RETURN IF WE ARE WITHIN BUFFER. - PUSH BC - CALL TRKSEC ; WE NEED THE NEXT DIRECTORY SECTOR. - CALL DIRREAD - POP BC - JP CHECKDIR -; -; ROUTINE TO TO GET A BIT FROM THE DISK SPACE ALLOCATION -; MAP. IT IS RETURNED IN (A), BIT POSITION 0. ON ENTRY TO HERE, -; SET (BC) TO THE BLOCK NUMBER ON THE DISK TO CHECK. -; ON RETURN, (D) WILL CONTAIN THE ORIGINAL BIT POSITION FOR -; THIS BLOCK NUMBER AND (HL) WILL POINT TO THE ADDRESS FOR IT. -; -CKBITMAP: - LD A,C ; DETERMINE BIT NUMBER OF INTEREST. - AND 07H ; COMPUTE (D)=(E)=(C AND 7)+1. - INC A - LD E,A ; SAVE PARTICULAR BIT NUMBER. - LD D,A -; -; COMPUTE (BC)=(BC)/8. -; - LD A,C - RRCA ; NOW SHIFT RIGHT 3 BITS. - RRCA - RRCA - AND 1FH ; AND CLEAR BITS 7,6,5. - LD C,A - LD A,B - ADD A,A ; NOW SHIFT (B) INTO BITS 7,6,5. - ADD A,A - ADD A,A - ADD A,A - ADD A,A - OR C ; AND ADD IN (C). - LD C,A ; OK, (C) HA BEEN COMPLETED. - LD A,B ; IS THERE A BETTER WAY OF DOING THIS? - RRCA - RRCA - RRCA - AND 1FH - LD B,A ; AND NOW (B) IS COMPLETED. -; -; USE THIS AS AN OFFSET INTO THE DISK SPACE ALLOCATION -; TABLE. -; - LD HL,(ALOCVECT) - ADD HL,BC - LD A,(HL) ; NOW GET CORRECT BYTE. -CKBMAP1:RLCA ; GET CORRECT BIT INTO POSITION 0. - DEC E - JP NZ,CKBMAP1 - RET -; -; SET OR CLEAR THE BIT MAP SUCH THAT BLOCK NUMBER (BC) WILL BE MARKED -; AS USED. ON ENTRY, IF (E)=0 THEN THIS BIT WILL BE CLEARED, IF IT .EQUALS -; 1 THEN IT WILL BE SET (DON'T USE ANYOTHER VALUES). -; -STBITMAP: - PUSH DE - CALL CKBITMAP ; GET THE BYTE OF INTEREST. - AND 0FEH ; CLEAR THE AFFECTED BIT. - POP BC - OR C ; AND NOW SET IT ACORDING TO (C). -; -; ENTRY TO RESTORE THE ORIGINAL BIT POSITION AND THEN STORE -; IN TABLE. (A) CONTAINS THE VALUE, (D) CONTAINS THE BIT -; POSITION (1-8), AND (HL) POINTS TO THE ADDRESS WITHIN THE -; SPACE ALLOCATION TABLE FOR THIS BYTE. -; -STBMAP1:RRCA ; RESTORE ORIGINAL BIT POSITION. - DEC D - JP NZ,STBMAP1 - LD (HL),A ; AND STOR BYTE IN TABLE. - RET -; -; SET/CLEAR SPACE USED BITS IN ALLOCATION MAP FOR THIS FILE. -; ON ENTRY, (C)=1 TO SET THE MAP AND (C)=0 TO CLEAR IT. -; -SETFILE:CALL FCB2HL ; GET ADDRESS OF FCB - LD DE,16 - ADD HL,DE ; GET TO BLOCK NUMBER BYTES. - PUSH BC - LD C,17 ; CHECK ALL 17 BYTES (MAX) OF TABLE. -SETFL1: POP DE - DEC C ; DONE ALL BYTES YET? - RET Z - PUSH DE - LD A,(BIGDISK) ; CHECK DISK SIZE FOR 16 BIT BLOCK NUMBERS. - OR A - JP Z,SETFL2 - PUSH BC ; ONLY 8 BIT NUMBERS. SET (BC) TO THIS ONE. - PUSH HL - LD C,(HL) ; GET LOW BYTE FROM TABLE, ALWAYS - LD B,0 ; SET HIGH BYTE TO ZERO. - JP SETFL3 -SETFL2: DEC C ; FOR 16 BIT BLOCK NUMBERS, ADJUST COUNTER. - PUSH BC - LD C,(HL) ; NOW GET BOTH THE LOW AND HIGH BYTES. - INC HL - LD B,(HL) - PUSH HL -SETFL3: LD A,C ; BLOCK USED? - OR B - JP Z,SETFL4 - LD HL,(DSKSIZE) ; IS THIS BLOCK NUMBER WITHIN THE - LD A,L ; SPACE ON THE DISK? - SUB C - LD A,H - SBC A,B - CALL NC,STBITMAP ; YES, SET THE PROPER BIT. -SETFL4: POP HL ; POINT TO NEXT BLOCK NUMBER IN FCB. - INC HL - POP BC - JP SETFL1 -; -; CONSTRUCT THE SPACE USED ALLOCATION BIT MAP FOR THE ACTIVE -; DRIVE. IF A FILE NAME STARTS WITH '$' AND IT IS UNDER THE -; CURRENT USER NUMBER, THEN (STATUS) IS SET TO MINUS 1. OTHERWISE -; IT IS NOT SET AT ALL. -; -BITMAP: LD HL,(DSKSIZE) ; COMPUTE SIZE OF ALLOCATION TABLE. - LD C,3 - CALL SHIFTR ; (HL)=(HL)/8. - INC HL ; AT LEASE 1 BYTE. - LD B,H - LD C,L ; SET (BC) TO THE ALLOCATION TABLE LENGTH. -; -; INITIALIZE THE BITMAP FOR THIS DRIVE. RIGHT NOW, THE FIRST -; TWO BYTES ARE SPECIFIED BY THE DISK PARAMETER BLOCK. HOWEVER -; A PATCH COULD BE ENTERED HERE IF IT WERE NECESSARY TO SETUP -; THIS TABLE IN A SPECIAL MANNOR. FOR EXAMPLE, THE BIOS COULD -; DETERMINE LOCATIONS OF 'BAD BLOCKS' AND SET THEM AS ALREADY -; 'USED' IN THE MAP. -; - LD HL,(ALOCVECT) ; NOW ZERO OUT THE TABLE NOW. -BITMAP1:LD (HL),0 - INC HL - DEC BC - LD A,B - OR C - JP NZ,BITMAP1 - LD HL,(ALLOC0) ; GET INITIAL SPACE USED BY DIRECTORY. - EX DE,HL - LD HL,(ALOCVECT) ; AND PUT THIS INTO MAP. - LD (HL),E - INC HL - LD (HL),D -; -; END OF INITIALIZATION PORTION. -; - CALL HOMEDRV ; NOW HOME THE DRIVE. - LD HL,(SCRATCH1) - LD (HL),3 ; FORCE NEXT DIRECTORY R.EQUEST TO READ - INC HL ; IN A SECTOR. - LD (HL),0 - CALL STFILPOS ; CLEAR INITIAL FILE POSITION ALSO. -BITMAP2:LD C,0FFH ; READ NEXT FILE NAME IN DIRECTORY - CALL NXENTRY ; AND SET CHECKSUM BYTE. - CALL CKFILPOS ; IS THERE ANOTHER FILE? - RET Z - CALL FCB2HL ; YES, GET ITS ADDRESS. - LD A,0E5H - CP (HL) ; EMPTY FILE ENTRY? - JP Z,BITMAP2 - LD A,(USERNO) ; NO, CORRECT USER NUMBER? - CP (HL) - JP NZ,BITMAP3 - INC HL - LD A,(HL) ; YES, DOES NAME START WITH A '$'? - SUB '$' - JP NZ,BITMAP3 - DEC A ; YES, SET ATATUS TO MINUS ONE. - LD (STATUS),A -BITMAP3:LD C,1 ; NOW SET THIS FILE'S SPACE AS USED IN BIT MAP. - CALL SETFILE - CALL CHKNMBR ; KEEP (SCRATCH1) IN BOUNDS. - JP BITMAP2 -; -; SET THE STATUS (STATUS) AND RETURN. -; -STSTATUS: - LD A,(FNDSTAT) - JP SETSTAT -; -; CHECK EXTENTS IN (A) AND (C). SET THE ZERO FLAG IF THEY -; ARE THE SAME. THE NUMBER OF 16K CHUNKS OF DISK SPACE THAT -; THE DIRECTORY EXTENT COVERS IS EXPRESSAD IS (EXTMASK+1). -; NO REGISTERS ARE MODIFIED. -; -SAMEXT: PUSH BC - PUSH AF - LD A,(EXTMASK) ; GET EXTENT MASK AND USE IT TO - CPL ; TO COMPARE BOTH EXTENT NUMBERS. - LD B,A ; SAVE RESULTING MASK HERE. - LD A,C ; MASK FIRST EXTENT AND SAVE IN (C). - AND B - LD C,A - POP AF ; NOW MASK SECOND EXTENT AND COMPARE - AND B ; WITH THE FIRST ONE. - SUB C - AND 1FH ; (* ONLY CHECK BUTS 0-4 *) - POP BC ; THE ZERO FLAG IS SET IF THEY ARE THE SAME. - RET ; RESTORE (BC) AND RETURN. -; -; SEARCH FOR THE FIRST OCCURENCE OF A FILE NAME. ON ENTRY, -; REGISTER (C) SHOULD CONTAIN THE NUMBER OF BYTES OF THE FCB -; THAT MUST MATCH. -; -FINDFST:LD A,0FFH - LD (FNDSTAT),A - LD HL,COUNTER ; SAVE CHARACTER COUNT. - LD (HL),C - LD HL,(PARAMS) ; GET FILENAME TO MATCH. - LD (SAVEFCB),HL ; AND SAVE. - CALL STFILPOS ; CLEAR INITIAL FILE POSITION (SET TO 0FFFFH). - CALL HOMEDRV ; HOME THE DRIVE. -; -; ENTRY TO LOCATE THE NEXT OCCURENCE OF A FILENAME WITHIN THE -; DIRECTORY. THE DISK IS NOT EXPECTED TO HAVE BEEN CHANGED. IF -; IT WAS, THEN IT WILL BE WRITE PROTECTED. -; -FINDNXT:LD C,0 ; WRITE PROTECT THE DISK IF CHANGED. - CALL NXENTRY ; GET NEXT FILENAME ENTRY IN DIRECTORY. - CALL CKFILPOS ; IS FILE POSITION = 0FFFFH? - JP Z,FNDNXT6 ; YES, EXIT NOW THEN. - LD HL,(SAVEFCB) ; SET (DE) POINTING TO FILENAME TO MATCH. - EX DE,HL - LD A,(DE) - CP 0E5H ; EMPTY DIRECTORY ENTRY? - JP Z,FNDNXT1 ; (* ARE WE TRYING TO RESERECT ERASED ENTRIES? *) - PUSH DE - CALL MOREFLS ; MORE FILES IN DIRECTORY? - POP DE - JP NC,FNDNXT6 ; NO MORE. EXIT NOW. -FNDNXT1:CALL FCB2HL ; GET ADDRESS OF THIS FCB IN DIRECTORY. - LD A,(COUNTER) ; GET NUMBER OF BYTES (CHARACTERS) TO CHECK. - LD C,A - LD B,0 ; INITIALIZE BYTE POSITION COUNTER. -FNDNXT2:LD A,C ; ARE WE DONE WITH THE COMPARE? - OR A - JP Z,FNDNXT5 - LD A,(DE) ; NO, CHECK NEXT BYTE. - CP '?' ; DON'T CARE ABOUT THIS CHARACTER? - JP Z,FNDNXT4 - LD A,B ; GET BYTES POSITION IN FCB. - CP 13 ; DON'T CARE ABOUT THE THIRTEENTH BYTE EITHER. - JP Z,FNDNXT4 - CP 12 ; EXTENT BYTE? - LD A,(DE) - JP Z,FNDNXT3 - SUB (HL) ; OTHERWISE COMPARE CHARACTERS. - AND 7FH - JP NZ,FINDNXT ; NOT THE SAME, CHECK NEXT ENTRY. - JP FNDNXT4 ; SO FAR SO GOOD, KEEP CHECKING. -FNDNXT3:PUSH BC ; CHECK THE EXTENT BYTE HERE. - LD C,(HL) - CALL SAMEXT - POP BC - JP NZ,FINDNXT ; NOT THE SAME, LOOK SOME MORE. -; -; SO FAR THE NAMES COMPARE. BUMP POINTERS TO THE NEXT BYTE -; AND CONTINUE UNTIL ALL (C) CHARACTERS HAVE BEEN CHECKED. -; -FNDNXT4:INC DE ; BUMP POINTERS. - INC HL - INC B - DEC C ; ADJUST CHARACTER COUNTER. - JP FNDNXT2 -FNDNXT5:LD A,(FILEPOS) ; RETURN THE POSITION OF THIS ENTRY. - AND 03H - LD (STATUS),A - LD HL,FNDSTAT - LD A,(HL) - RLA - RET NC - XOR A - LD (HL),A - RET -; -; FILENAME WAS NOT FOUND. SET APPROPRIATE STATUS. -; -FNDNXT6:CALL STFILPOS ; SET (FILEPOS) TO 0FFFFH. - LD A,0FFH ; SAY NOT LOCATED. - JP SETSTAT -; -; ERASE FILES FROM THE DIRECTORY. ONLY THE FIRST BYTE OF THE -; FCB WILL BE AFFECTED. IT IS SET TO (E5). -; -ERAFILE:CALL CHKWPRT ; IS DISK WRITE PROTECTED? - LD C,12 ; ONLY COMPARE FILE NAMES. - CALL FINDFST ; GET FIRST FILE NAME. -ERAFIL1:CALL CKFILPOS ; ANY FOUND? - RET Z ; NOPE, WE MUST BE DONE. - CALL CHKROFL ; IS FILE READ ONLY? - CALL FCB2HL ; NOPE, GET ADDRESS OF FCB AND - LD (HL),0E5H ; SET FIRST BYTE TO 'EMPTY'. - LD C,0 ; CLEAR THE SPACE FROM THE BIT MAP. - CALL SETFILE - CALL DIRWRITE ; NOW WRITE THE DIRECTORY SECTOR BACK OUT. - CALL FINDNXT ; FIND THE NEXT FILE NAME. - JP ERAFIL1 ; AND REPEAT PROCESS. -; -; LOOK THROUGH THE SPACE ALLOCATION MAP (BIT MAP) FOR THE -; NEXT AVAILABLE BLOCK. START SEARCHING AT BLOCK NUMBER (BC-1). -; THE SEARCH PROCEDURE IS TO LOOK FOR AN EMPTY BLOCK THAT IS -; BEFORE THE STARTING BLOCK. IF NOT EMPTY, LOOK AT A LATER -; BLOCK NUMBER. IN THIS WAY, WE RETURN THE CLOSEST EMPTY BLOCK -; ON EITHER SIDE OF THE 'TARGET' BLOCK NUMBER. THIS WILL SPEED -; ACCESS ON RANDOM DEVICES. FOR SERIAL DEVICES, THIS SHOULD BE -; CHANGED TO LOOK IN THE FORWARD DIRECTION FIRST AND THEN START -; AT THE FRONT AND SEARCH SOME MORE. -; -; ON RETURN, (DE)= BLOCK NUMBER THAT IS EMPTY AND (HL) =0 -; IF NO EMPRY BLOCK WAS FOUND. -; -FNDSPACE: - LD D,B ; SET (DE) AS THE BLOCK THAT IS CHECKED. - LD E,C -; -; LOOK BEFORE TARGET BLOCK. REGISTERS (BC) ARE USED AS THE LOWER -; POINTER AND (DE) AS THE UPPER POINTER. -; -FNDSPA1:LD A,C ; IS BLOCK 0 SPECIFIED? - OR B - JP Z,FNDSPA2 - DEC BC ; NOPE, CHECK PREVIOUS BLOCK. - PUSH DE - PUSH BC - CALL CKBITMAP - RRA ; IS THIS BLOCK EMPTY? - JP NC,FNDSPA3 ; YES. USE THIS. -; -; NOTE THAT THE ABOVE LOGIC GETS THE FIRST BLOCK THAT IT FINDS -; THAT IS EMPTY. THUS A FILE COULD BE WRITTEN 'BACKWARD' MAKING -; IT VERY SLOW TO ACCESS. THIS COULD BE CHANGED TO LOOK FOR THE -; FIRST EMPTY BLOCK AND THEN CONTINUE UNTIL THE START OF THIS -; EMPTY SPACE IS LOCATED AND THEN USED THAT STARTING BLOCK. -; THIS SHOULD HELP SPEED UP ACCESS TO SOME FILES ESPECIALLY ON -; A WELL USED DISK WITH LOTS OF FAIRLY SMALL 'HOLES'. -; - POP BC ; NOPE, CHECK SOME MORE. - POP DE -; -; NOW LOOK AFTER TARGET BLOCK. -; -FNDSPA2:LD HL,(DSKSIZE) ; IS BLOCK (DE) WITHIN DISK LIMITS? - LD A,E - SUB L - LD A,D - SBC A,H - JP NC,FNDSPA4 - INC DE ; YES, MOVE ON TO NEXT ONE. - PUSH BC - PUSH DE - LD B,D - LD C,E - CALL CKBITMAP ; CHECK IT. - RRA ; EMPTY? - JP NC,FNDSPA3 - POP DE ; NOPE, CONTINUE SEARCHING. - POP BC - JP FNDSPA1 -; -; EMPTY BLOCK FOUND. SET IT AS USED AND RETURN WITH (HL) -; POINTING TO IT (TRUE?). -; -FNDSPA3:RLA ; RESET BYTE. - INC A ; AND SET BIT 0. - CALL STBMAP1 ; UPDATE BIT MAP. - POP HL ; SET RETURN REGISTERS. - POP DE - RET -; -; FREE BLOCK WAS NOT FOUND. IF (BC) IS NOT ZERO, THEN WE HAVE -; NOT CHECKED ALL OF THE DISK SPACE. -; -FNDSPA4:LD A,C - OR B - JP NZ,FNDSPA1 - LD HL,0 ; SET 'NOT FOUND' STATUS. - RET -; -; MOVE A COMPLETE FCB ENTRY INTO THE DIRECTORY AND WRITE IT. -; -FCBSET: LD C,0 - LD E,32 ; LENGTH OF EACH ENTRY. -; -; MOVE (E) BYTES FROM THE FCB POINTED TO BY (PARAMS) INTO -; FCB IN DIRECTORY STARTING AT RELATIVE BYTE (C). THIS UPDATED -; DIRECTORY BUFFER IS THEN WRITTEN TO THE DISK. -; -UPDATE: PUSH DE - LD B,0 ; SET (BC) TO RELATIVE BYTE POSITION. - LD HL,(PARAMS) ; GET ADDRESS OF FCB. - ADD HL,BC ; COMPUTE STARTING BYTE. - EX DE,HL - CALL FCB2HL ; GET ADDRESS OF FCB TO UPDATE IN DIRECTORY. - POP BC ; SET (C) TO NUMBER OF BYTES TO CHANGE. - CALL DE2HL -UPDATE1:CALL TRKSEC ; DETERMINE THE TRACK AND SECTOR AFFECTED. - JP DIRWRITE ; THEN WRITE THIS SECTOR OUT. -; -; ROUTINE TO CHANGE THE NAME OF ALL FILES ON THE DISK WITH A -; SPECIFIED NAME. THE FCB CONTAINS THE CURRENT NAME AS THE -; FIRST 12 CHARACTERS AND THE NEW NAME 16 BYTES INTO THE FCB. -; -CHGNAMES: - CALL CHKWPRT ; CHECK FOR A WRITE PROTECTED DISK. - LD C,12 ; MATCH FIRST 12 BYTES OF FCB ONLY. - CALL FINDFST ; GET FIRST NAME. - LD HL,(PARAMS) ; GET ADDRESS OF FCB. - LD A,(HL) ; GET USER NUMBER. - LD DE,16 ; MOVE OVER TO DESIRED NAME. - ADD HL,DE - LD (HL),A ; KEEP SAME USER NUMBER. -CHGNAM1:CALL CKFILPOS ; ANY MATCHING FILE FOUND? - RET Z ; NO, WE MUST BE DONE. - CALL CHKROFL ; CHECK FOR READ ONLY FILE. - LD C,16 ; START 16 BYTES INTO FCB. - LD E,12 ; AND UPDATE THE FIRST 12 BYTES OF DIRECTORY. - CALL UPDATE - CALL FINDNXT ; GET TE NEXT FILE NAME. - JP CHGNAM1 ; AND CONTINUE. -; -; UPDATE A FILES ATTRIBUTES. THE PROCEDURE IS TO SEARCH FOR -; EVERY FILE WITH THE SAME NAME AS SHOWN IN FCB (IGNORING BIT 7) -; AND THEN TO UPDATE IT (WHICH INCLUDES BIT 7). NO OTHER CHANGES -; ARE MADE. -; -SAVEATTR: - LD C,12 ; MATCH FIRST 12 BYTES. - CALL FINDFST ; LOOK FOR FIRST FILENAME. -SAVATR1:CALL CKFILPOS ; WAS ONE FOUND? - RET Z ; NOPE, WE MUST BE DONE. - LD C,0 ; YES, UPDATE THE FIRST 12 BYTES NOW. - LD E,12 - CALL UPDATE ; UPDATE FILENAME AND WRITE DIRECTORY. - CALL FINDNXT ; AND GET THE NEXT FILE. - JP SAVATR1 ; THEN CONTINUE UNTIL DONE. -; -; OPEN A FILE (NAME SPECIFIED IN FCB). -; -OPENIT: LD C,15 ; COMPARE THE FIRST 15 BYTES. - CALL FINDFST ; GET THE FIRST ONE IN DIRECTORY. - CALL CKFILPOS ; ANY AT ALL? - RET Z -OPENIT1:CALL SETEXT ; POINT TO EXTENT BYTE WITHIN USERS FCB. - LD A,(HL) ; AND GET IT. - PUSH AF ; SAVE IT AND ADDRESS. - PUSH HL - CALL FCB2HL ; POINT TO FCB IN DIRECTORY. - EX DE,HL - LD HL,(PARAMS) ; THIS IS THE USERS COPY. - LD C,32 ; MOVE IT INTO USERS SPACE. - PUSH DE - CALL DE2HL - CALL SETS2B7 ; SET BIT 7 IN 'S2' BYTE (UNMODIFIED). - POP DE ; NOW GET THE EXTENT BYTE FROM THIS FCB. - LD HL,12 - ADD HL,DE - LD C,(HL) ; INTO (C). - LD HL,15 ; NOW GET THE RECORD COUNT BYTE INTO (B). - ADD HL,DE - LD B,(HL) - POP HL ; KEEP THE SAME EXTENT AS THE USER HAD ORIGINALLY. - POP AF - LD (HL),A - LD A,C ; IS IT THE SAME AS IN THE DIRECTORY FCB? - CP (HL) - LD A,B ; IF YES, THEN USE THE SAME RECORD COUNT. - JP Z,OPENIT2 - LD A,0 ; IF THE USER SPECIFIED AN EXTENT GREATER THAN - JP C,OPENIT2 ; THE ONE IN THE DIRECTORY, THEN SET RECORD COUNT TO 0. - LD A,128 ; OTHERWISE SET TO MAXIMUM. -OPENIT2:LD HL,(PARAMS) ; SET RECORD COUNT IN USERS FCB TO (A). - LD DE,15 - ADD HL,DE ; COMPUTE RELATIVE POSITION. - LD (HL),A ; AND SET THE RECORD COUNT. - RET -; -; MOVE TWO BYTES FROM (DE) TO (HL) IF (AND ONLY IF) (HL) -; POINT TO A ZERO VALUE (16 BIT). -; RETURN WITH ZERO FLAG SET IT (DE) WAS MOVED. REGISTERS (DE) -; AND (HL) ARE NOT CHANGED. HOWEVER (A) IS. -; -MOVEWORD: - LD A,(HL) ; CHECK FOR A ZERO WORD. - INC HL - OR (HL) ; BOTH BYTES ZERO? - DEC HL - RET NZ ; NOPE, JUST RETURN. - LD A,(DE) ; YES, MOVE TWO BYTES FROM (DE) INTO - LD (HL),A ; THIS ZERO SPACE. - INC DE - INC HL - LD A,(DE) - LD (HL),A - DEC DE ; DON'T DISTURB THESE REGISTERS. - DEC HL - RET -; -; GET HERE TO CLOSE A FILE SPECIFIED BY (FCB). -; -CLOSEIT:XOR A ; CLEAR STATUS AND FILE POSITION BYTES. - LD (STATUS),A - LD (FILEPOS),A - LD (FILEPOS+1),A - CALL GETWPRT ; GET WRITE PROTECT BIT FOR THIS DRIVE. - RET NZ ; JUST RETURN IF IT IS SET. - CALL GETS2 ; ELSE GET THE 'S2' BYTE. - AND 80H ; AND LOOK AT BIT 7 (FILE UNMODIFIED?). - RET NZ ; JUST RETURN IF SET. - LD C,15 ; ELSE LOOK UP THIS FILE IN DIRECTORY. - CALL FINDFST - CALL CKFILPOS ; WAS IT FOUND? - RET Z ; JUST RETURN IF NOT. - LD BC,16 ; SET (HL) POINTING TO RECORDS USED SECTION. - CALL FCB2HL - ADD HL,BC - EX DE,HL - LD HL,(PARAMS) ; DO THE SAME FOR USERS SPECIFIED FCB. - ADD HL,BC - LD C,16 ; THIS MANY BYTES ARE PRESENT IN THIS EXTENT. -CLOSEIT1: - LD A,(BIGDISK) ; 8 OR 16 BIT RECORD NUMBERS? - OR A - JP Z,CLOSEIT4 - LD A,(HL) ; JUST 8 BIT. GET ONE FROM USERS FCB. - OR A - LD A,(DE) ; NOW GET ONE FROM DIRECTORY FCB. - JP NZ,CLOSEIT2 - LD (HL),A ; USERS BYTE WAS ZERO. UPDATE FROM DIRECTORY. -CLOSEIT2: - OR A - JP NZ,CLOSEIT3 - LD A,(HL) ; DIRECTORIES BYTE WAS ZERO, UPDATE FROM USERS FCB. - LD (DE),A -CLOSEIT3: - CP (HL) ; IF NEITHER ONE OF THESE BYTES WERE ZERO, - JP NZ,CLOSEIT7 ; THEN CLOSE ERROR IF THEY ARE NOT THE SAME. - JP CLOSEIT5 ; OK SO FAR, GET TO NEXT BYTE IN FCBS. -CLOSEIT4: - CALL MOVEWORD ; UPDATE USERS FCB IF IT IS ZERO. - EX DE,HL - CALL MOVEWORD ; UPDATE DIRECTORIES FCB IF IT IS ZERO. - EX DE,HL - LD A,(DE) ; IF THESE TWO VALUES ARE NO DIFFERENT, - CP (HL) ; THEN A CLOSE ERROR OCCURED. - JP NZ,CLOSEIT7 - INC DE ; CHECK SECOND BYTE. - INC HL - LD A,(DE) - CP (HL) - JP NZ,CLOSEIT7 - DEC C ; REMEMBER 16 BIT VALUES. -CLOSEIT5: - INC DE ; BUMP TO NEXT ITEM IN TABLE. - INC HL - DEC C ; THERE ARE 16 ENTRIES ONLY. - JP NZ,CLOSEIT1 ; CONTINUE IF MORE TO DO. - LD BC,0FFECH ; BACKUP 20 PLACES (EXTENT BYTE). - ADD HL,BC - EX DE,HL - ADD HL,BC - LD A,(DE) - CP (HL) ; DIRECTORY'S EXTENT ALREADY GREATER THAN THE - JP C,CLOSEIT6 ; USERS EXTENT? - LD (HL),A ; NO, UPDATE DIRECTORY EXTENT. - LD BC,3 ; AND UPDATE THE RECORD COUNT BYTE IN - ADD HL,BC ; DIRECTORIES FCB. - EX DE,HL - ADD HL,BC - LD A,(HL) ; GET FROM USER. - LD (DE),A ; AND PUT IN DIRECTORY. -CLOSEIT6: - LD A,0FFH ; SET 'WAS OPEN AND IS NOW CLOSED' BYTE. - LD (CLOSEFLG),A - JP UPDATE1 ; UPDATE THE DIRECTORY NOW. -CLOSEIT7: - LD HL,STATUS ; SET RETURN STATUS AND THEN RETURN. - DEC (HL) - RET -; -; ROUTINE TO GET THE NEXT EMPTY SPACE IN THE DIRECTORY. IT -; WILL THEN BE CLEARED FOR USE. -; -GETEMPTY: - CALL CHKWPRT ; MAKE SURE DISK IS NOT WRITE PROTECTED. - LD HL,(PARAMS) ; SAVE CURRENT PARAMETERS (FCB). - PUSH HL - LD HL,EMPTYFCB ; USE SPECIAL ONE FOR EMPTY SPACE. - LD (PARAMS),HL - LD C,1 ; SEARCH FOR FIRST EMPTY SPOT IN DIRECTORY. - CALL FINDFST ; (* ONLY CHECK FIRST BYTE *) - CALL CKFILPOS ; NONE? - POP HL - LD (PARAMS),HL ; RESTORE ORIGINAL FCB ADDRESS. - RET Z ; RETURN IF NO MORE SPACE. - EX DE,HL - LD HL,15 ; POINT TO NUMBER OF RECORDS FOR THIS FILE. - ADD HL,DE - LD C,17 ; AND CLEAR ALL OF THIS SPACE. - XOR A -GETMT1: LD (HL),A - INC HL - DEC C - JP NZ,GETMT1 - LD HL,13 ; CLEAR THE 'S1' BYTE ALSO. - ADD HL,DE - LD (HL),A - CALL CHKNMBR ; KEEP (SCRATCH1) WITHIN BOUNDS. - CALL FCBSET ; WRITE OUT THIS FCB ENTRY TO DIRECTORY. - JP SETS2B7 ; SET 'S2' BYTE BIT 7 (UNMODIFIED AT PRESENT). -; -; ROUTINE TO CLOSE THE CURRENT EXTENT AND OPEN THE NEXT ONE -; FOR READING. -; -GETNEXT:XOR A - LD (CLOSEFLG),A ; CLEAR CLOSE FLAG. - CALL CLOSEIT ; CLOSE THIS EXTENT. - CALL CKFILPOS - RET Z ; NOT THERE??? - LD HL,(PARAMS) ; GET EXTENT BYTE. - LD BC,12 - ADD HL,BC - LD A,(HL) ; AND INCREMENT IT. - INC A - AND 1FH ; KEEP WITHIN RANGE 0-31. - LD (HL),A - JP Z,GTNEXT1 ; OVERFLOW? - LD B,A ; MASK EXTENT BYTE. - LD A,(EXTMASK) - AND B - LD HL,CLOSEFLG ; CHECK CLOSE FLAG (0FFH IS OK). - AND (HL) - JP Z,GTNEXT2 ; IF ZERO, WE MUST READ IN NEXT EXTENT. - JP GTNEXT3 ; ELSE, IT IS ALREADY IN MEMORY. -GTNEXT1:LD BC,2 ; POINT TO THE 'S2' BYTE. - ADD HL,BC - INC (HL) ; AND BUMP IT. - LD A,(HL) ; TOO MANY EXTENTS? - AND 0FH - JP Z,GTNEXT5 ; YES, SET ERROR CODE. -; -; GET HERE TO OPEN THE NEXT EXTENT. -; -GTNEXT2:LD C,15 ; SET TO CHECK FIRST 15 BYTES OF FCB. - CALL FINDFST ; FIND THE FIRST ONE. - CALL CKFILPOS ; NONE AVAILABLE? - JP NZ,GTNEXT3 - LD A,(R.DWRTFLG) ; NO EXTENT PRESENT. CAN WE OPEN AN EMPTY ONE? - INC A ; 0FFH MEANS READING (SO NOT POSSIBLE). - JP Z,GTNEXT5 ; OR AN ERROR. - CALL GETEMPTY ; WE ARE WRITING, GET AN EMPTY ENTRY. - CALL CKFILPOS ; NONE? - JP Z,GTNEXT5 ; ERROR IF TRUE. - JP GTNEXT4 ; ELSE WE ARE ALMOST DONE. -GTNEXT3:CALL OPENIT1 ; OPEN THIS EXTENT. -GTNEXT4:CALL STRDATA ; MOVE IN UPDATED DATA (REC #, EXTENT #, ETC.) - XOR A ; CLEAR STATUS AND RETURN. - JP SETSTAT -; -; ERROR IN EXTENDING THE FILE. TOO MANY EXTENTS WERE NEEDED -; OR NOT ENOUGH SPACE ON THE DISK. -; -GTNEXT5:CALL IOERR1 ; SET ERROR CODE, CLEAR BIT 7 OF 'S2' - JP SETS2B7 ; SO THIS IS NOT WRITTEN ON A CLOSE. -; -; READ A S.EQUENTIAL FILE. -; -RDSEQ: LD A,1 ; SET S.EQUENTIAL ACCESS MODE. - LD (MODE),A -RDSEQ1: LD A,0FFH ; DON'T ALLOW READING UNWRITTEN SPACE. - LD (R.DWRTFLG),A - CALL STRDATA ; PUT REC# AND EXT# INTO FCB. - LD A,(SAVNREC) ; GET NEXT RECORD TO READ. - LD HL,SAVNXT ; GET NUMBER OF RECORDS IN EXTENT. - CP (HL) ; WITHIN THIS EXTENT? - JP C,RDSEQ2 - CP 128 ; NO. IS THIS EXTENT FULLY USED? - JP NZ,RDSEQ3 ; NO. END-OF-FILE. - CALL GETNEXT ; YES, OPEN THE NEXT ONE. - XOR A ; RESET NEXT RECORD TO READ. - LD (SAVNREC),A - LD A,(STATUS) ; CHECK ON OPEN, SUCCESSFUL? - OR A - JP NZ,RDSEQ3 ; NO, ERROR. -RDSEQ2: CALL COMBLK ; OK. COMPUTE BLOCK NUMBER TO READ. - CALL CHKBLK ; CHECK IT. WITHIN BOUNDS? - JP Z,RDSEQ3 ; NO, ERROR. - CALL LOGICAL ; CONVERT (BLKNMBR) TO LOGICAL SECTOR (128 BYTE). - CALL TRKSEC1 ; SET THE TRACK AND SECTOR FOR THIS BLOCK #. - CALL DOREAD ; AND READ IT. - JP SETNREC ; AND SET THE NEXT RECORD TO BE ACCESSED. -; -; READ ERROR OCCURED. SET STATUS AND RETURN. -; -RDSEQ3: JP IOERR1 -; -; WRITE THE NEXT S.EQUENTIAL RECORD. -; -WTSEQ: LD A,1 ; SET S.EQUENTIAL ACCESS MODE. - LD (MODE),A -WTSEQ1: LD A,0 ; ALLOW AN ADDITION EMPTY EXTENT TO BE OPENED. - LD (R.DWRTFLG),A - CALL CHKWPRT ; CHECK WRITE PROTECT STATUS. - LD HL,(PARAMS) - CALL CKROF1 ; CHECK FOR READ ONLY FILE, (HL) ALREADY SET TO FCB. - CALL STRDATA ; PUT UPDATED DATA INTO FCB. - LD A,(SAVNREC) ; GET RECORD NUMBER TO WRITE. - CP 128 ; WITHIN RANGE? - JP NC,IOERR1 ; NO, ERROR(?). - CALL COMBLK ; COMPUTE BLOCK NUMBER. - CALL CHKBLK ; CHECK NUMBER. - LD C,0 ; IS THERE ONE TO WRITE TO? - JP NZ,WTSEQ6 ; YES, GO DO IT. - CALL GETBLOCK ; GET NEXT BLOCK NUMBER WITHIN FCB TO USE. - LD (RELBLOCK),A ; AND SAVE. - LD BC,0 ; START LOOKING FOR SPACE FROM THE START - OR A ; IF NONE ALLOCATED AS YET. - JP Z,WTSEQ2 - LD C,A ; EXTRACT PREVIOUS BLOCK NUMBER FROM FCB - DEC BC ; SO WE CAN BE CLOSEST TO IT. - CALL EXTBLK - LD B,H - LD C,L -WTSEQ2: CALL FNDSPACE ; FIND THE NEXT EMPTY BLOCK NEAREST NUMBER (BC). - LD A,L ; CHECK FOR A ZERO NUMBER. - OR H - JP NZ,WTSEQ3 - LD A,2 ; NO MORE SPACE? - JP SETSTAT -WTSEQ3: LD (BLKNMBR),HL ; SAVE BLOCK NUMBER TO ACCESS. - EX DE,HL ; PUT BLOCK NUMBER INTO (DE). - LD HL,(PARAMS) ; NOW WE MUST UPDATE THE FCB FOR THIS - LD BC,16 ; NEWLY ALLOCATED BLOCK. - ADD HL,BC - LD A,(BIGDISK) ; 8 OR 16 BIT BLOCK NUMBERS? - OR A - LD A,(RELBLOCK) ; (* UPDATE THIS ENTRY *) - JP Z,WTSEQ4 ; ZERO MEANS 16 BIT ONES. - CALL ADDA2HL ; (HL)=(HL)+(A) - LD (HL),E ; STORE NEW BLOCK NUMBER. - JP WTSEQ5 -WTSEQ4: LD C,A ; COMPUTE SPOT IN THIS 16 BIT TABLE. - LD B,0 - ADD HL,BC - ADD HL,BC - LD (HL),E ; STUFF BLOCK NUMBER (DE) THERE. - INC HL - LD (HL),D -WTSEQ5: LD C,2 ; SET (C) TO INDICATE WRITING TO UN-USED DISK SPACE. -WTSEQ6: LD A,(STATUS) ; ARE WE OK SO FAR? - OR A - RET NZ - PUSH BC ; YES, SAVE WRITE FLAG FOR BIOS (REGISTER C). - CALL LOGICAL ; CONVERT (BLKNMBR) OVER TO LOICAL SECTORS. - LD A,(MODE) ; GET ACCESS MODE FLAG (1=S.EQUENTIAL, - DEC A ; 0=RANDOM, 2=SPECIAL?). - DEC A - JP NZ,WTSEQ9 -; -; SPECIAL RANDOM I/O FROM FUNCTION #40. MAYBE FOR M/PM, BUT THE -; CURRENT BLOCK, IF IT HAS NOT BEEN WRITTEN TO, WILL BE ZEROED -; OUT AND THEN WRITTEN (REASON?). -; - POP BC - PUSH BC - LD A,C ; GET WRITE STATUS FLAG (2=WRITING UNUSED SPACE). - DEC A - DEC A - JP NZ,WTSEQ9 - PUSH HL - LD HL,(DIRBUF) ; ZERO OUT THE DIRECTORY BUFFER. - LD D,A ; NOTE THAT (A) IS ZERO HERE. -WTSEQ7: LD (HL),A - INC HL - INC D ; DO 128 BYTES. - JP P,WTSEQ7 - CALL DIRDMA ; TELL THE BIOS THE DMA ADDRESS FOR DIRECTORY ACCESS. - LD HL,(LOGSECT) ; GET SECTOR THAT STARTS CURRENT BLOCK. - LD C,2 ; SET 'WRITING TO UNUSED SPACE' FLAG. -WTSEQ8: LD (BLKNMBR),HL ; SAVE SECTOR TO WRITE. - PUSH BC - CALL TRKSEC1 ; DETERMINE ITS TRACK AND SECTOR NUMBERS. - POP BC - CALL DOWRITE ; NOW WRITE OUT 128 BYTES OF ZEROS. - LD HL,(BLKNMBR) ; GET SECTOR NUMBER. - LD C,0 ; SET NORMAL WRITE FLAG. - LD A,(BLKMASK) ; DETERMINE IF WE HAVE WRITTEN THE ENTIRE - LD B,A ; PHYSICAL BLOCK. - AND L - CP B - INC HL ; PREPARE FOR THE NEXT ONE. - JP NZ,WTSEQ8 ; CONTINUE UNTIL (BLKMASK+1) SECTORS WRITTEN. - POP HL ; RESET NEXT SECTOR NUMBER. - LD (BLKNMBR),HL - CALL DEFDMA ; AND RESET DMA ADDRESS. -; -; NORMAL DISK WRITE. SET THE DESIRED TRACK AND SECTOR THEN -; DO THE ACTUAL WRITE. -; -WTSEQ9: CALL TRKSEC1 ; DETERMINE TRACK AND SECTOR FOR THIS WRITE. - POP BC ; GET WRITE STATUS FLAG. - PUSH BC - CALL DOWRITE ; AND WRITE THIS OUT. - POP BC - LD A,(SAVNREC) ; GET NUMBER OF RECORDS IN FILE. - LD HL,SAVNXT ; GET LAST RECORD WRITTEN. - CP (HL) - JP C,WTSEQ10 - LD (HL),A ; WE HAVE TO UPDATE RECORD COUNT. - INC (HL) - LD C,2 -; -;* THIS AREA HAS BEEN PATCHED TO CORRECT DISK UPDATE PROBLEM -;* WHEN USING BLOCKING AND DE-BLOCKING IN THE BIOS. -; -WTSEQ10:NOP ; WAS 'DCR C' - NOP ; WAS 'DCR C' - LD HL,0 ; WAS 'JNZ WTSEQ99' -; -; * END OF PATCH. -; - PUSH AF - CALL GETS2 ; SET 'EXTENT WRITTEN TO' FLAG. - AND 7FH ; (* CLEAR BIT 7 *) - LD (HL),A - POP AF ; GET RECORD COUNT FOR THIS EXTENT. -WTSEQ99:CP 127 ; IS IT FULL? - JP NZ,WTSEQ12 - LD A,(MODE) ; YES, ARE WE IN S.EQUENTIAL MODE? - CP 1 - JP NZ,WTSEQ12 - CALL SETNREC ; YES, SET NEXT RECORD NUMBER. - CALL GETNEXT ; AND GET NEXT EMPTY SPACE IN DIRECTORY. - LD HL,STATUS ; OK? - LD A,(HL) - OR A - JP NZ,WTSEQ11 - DEC A ; YES, SET RECORD COUNT TO -1. - LD (SAVNREC),A -WTSEQ11:LD (HL),0 ; CLEAR STATUS. -WTSEQ12:JP SETNREC ; SET NEXT RECORD TO ACCESS. -; -; FOR RANDOM I/O, SET THE FCB FOR THE DESIRED RECORD NUMBER -; BASED ON THE 'R0,R1,R2' BYTES. THESE BYTES IN THE FCB ARE -; USED AS FOLLOWS: -; -; FCB+35 FCB+34 FCB+33 -; | 'R-2' | 'R-1' | 'R-0' | -; |7 0 | 7 0 | 7 0| -; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0| -; | OVERFLOW | | EXTRA | EXTENT | RECORD # | -; | ______________| |_EXTENT|__NUMBER___|_____________| -; ALSO 'S2' -; -; ON ENTRY, REGISTER (C) CONTAINS 0FFH IF THIS IS A READ -; AND THUS WE CAN NOT ACCESS UNWRITTEN DISK SPACE. OTHERWISE, -; ANOTHER EXTENT WILL BE OPENED (FOR WRITING) IF R.EQUIRED. -; -POSITION: - XOR A ; SET RANDOM I/O FLAG. - LD (MODE),A -; -; SPECIAL ENTRY (FUNCTION #40). M/PM ? -; -POSITN1:PUSH BC ; SAVE READ/WRITE FLAG. - LD HL,(PARAMS) ; GET ADDRESS OF FCB. - EX DE,HL - LD HL,33 ; NOW GET BYTE 'R0'. - ADD HL,DE - LD A,(HL) - AND 7FH ; KEEP BITS 0-6 FOR THE RECORD NUMBER TO ACCESS. - PUSH AF - LD A,(HL) ; NOW GET BIT 7 OF 'R0' AND BITS 0-3 OF 'R1'. - RLA - INC HL - LD A,(HL) - RLA - AND 1FH ; AND SAVE THIS IN BITS 0-4 OF (C). - LD C,A ; THIS IS THE EXTENT BYTE. - LD A,(HL) ; NOW GET THE EXTRA EXTENT BYTE. - RRA - RRA - RRA - RRA - AND 0FH - LD B,A ; AND SAVE IT IN (B). - POP AF ; GET RECORD NUMBER BACK TO (A). - INC HL ; CHECK OVERFLOW BYTE 'R2'. - LD L,(HL) - INC L - DEC L - LD L,6 ; PREPARE FOR ERROR. - JP NZ,POSITN5 ; OUT OF DISK SPACE ERROR. - LD HL,32 ; STORE RECORD NUMBER INTO FCB. - ADD HL,DE - LD (HL),A - LD HL,12 ; AND NOW CHECK THE EXTENT BYTE. - ADD HL,DE - LD A,C - SUB (HL) ; SAME EXTENT AS BEFORE? - JP NZ,POSITN2 - LD HL,14 ; YES, CHECK EXTRA EXTENT BYTE 'S2' ALSO. - ADD HL,DE - LD A,B - SUB (HL) - AND 7FH - JP Z,POSITN3 ; SAME, WE ARE ALMOST DONE THEN. -; -; GET HERE WHEN ANOTHER EXTENT IS R.EQUIRED. -; -POSITN2:PUSH BC - PUSH DE - CALL CLOSEIT ; CLOSE CURRENT EXTENT. - POP DE - POP BC - LD L,3 ; PREPARE FOR ERROR. - LD A,(STATUS) - INC A - JP Z,POSITN4 ; CLOSE ERROR. - LD HL,12 ; PUT DESIRED EXTENT INTO FCB NOW. - ADD HL,DE - LD (HL),C - LD HL,14 ; AND STORE EXTRA EXTENT BYTE 'S2'. - ADD HL,DE - LD (HL),B - CALL OPENIT ; TRY AND GET THIS EXTENT. - LD A,(STATUS) ; WAS IT THERE? - INC A - JP NZ,POSITN3 - POP BC ; NO. CAN WE CREATE A NEW ONE (WRITING?). - PUSH BC - LD L,4 ; PREPARE FOR ERROR. - INC C - JP Z,POSITN4 ; NOPE, READING UNWRITTEN SPACE ERROR. - CALL GETEMPTY ; YES WE CAN, TRY TO FIND SPACE. - LD L,5 ; PREPARE FOR ERROR. - LD A,(STATUS) - INC A - JP Z,POSITN4 ; OUT OF SPACE? -; -; NORMAL RETURN LOCATION. CLEAR ERROR CODE AND RETURN. -; -POSITN3:POP BC ; RESTORE STACK. - XOR A ; AND CLEAR ERROR CODE BYTE. - JP SETSTAT -; -; ERROR. SET THE 'S2' BYTE TO INDICATE THIS (WHY?). -; -POSITN4:PUSH HL - CALL GETS2 - LD (HL),0C0H - POP HL -; -; RETURN WITH ERROR CODE (PRESENTLY IN L). -; -POSITN5:POP BC - LD A,L ; GET ERROR CODE. - LD (STATUS),A - JP SETS2B7 -; -; READ A RANDOM RECORD. -; -READRAN:LD C,0FFH ; SET 'READ' STATUS. - CALL POSITION ; POSITION THE FILE TO PROPER RECORD. - CALL Z,RDSEQ1 ; AND READ IT AS USUAL (IF NO ERRORS). - RET -; -; WRITE TO A RANDOM RECORD. -; -WRITERAN: - LD C,0 ; SET 'WRITING' FLAG. - CALL POSITION ; POSITION THE FILE TO PROPER RECORD. - CALL Z,WTSEQ1 ; AND WRITE AS USUAL (IF NO ERRORS). - RET -; -; COMPUTE THE RANDOM RECORD NUMBER. ENTER WITH (HL) POINTING -; TO A FCB AN (DE) CONTAINS A RELATIVE LOCATION OF A RECORD -; NUMBER. ON EXIT, (C) CONTAINS THE 'R0' BYTE, (B) THE 'R1' -; BYTE, AND (A) THE 'R2' BYTE. -; -; ON RETURN, THE ZERO FLAG IS SET IF THE RECORD IS WITHIN -; BOUNDS. OTHERWISE, AN OVERFLOW OCCURED. -; -COMPRAND: - EX DE,HL ; SAVE FCB POINTER IN (DE). - ADD HL,DE ; COMPUTE RELATIVE POSITION OF RECORD #. - LD C,(HL) ; GET RECORD NUMBER INTO (BC). - LD B,0 - LD HL,12 ; NOW GET EXTENT. - ADD HL,DE - LD A,(HL) ; COMPUTE (BC)=(RECORD #)+(EXTENT)*128. - RRCA ; MOVE LOWER BIT INTO BIT 7. - AND 80H ; AND IGNORE ALL OTHER BITS. - ADD A,C ; ADD TO OUR RECORD NUMBER. - LD C,A - LD A,0 ; TAKE CARE OF ANY CARRY. - ADC A,B - LD B,A - LD A,(HL) ; NOW GET THE UPPER BITS OF EXTENT INTO - RRCA ; BIT POSITIONS 0-3. - AND 0FH ; AND IGNORE ALL OTHERS. - ADD A,B ; ADD THIS IN TO 'R1' BYTE. - LD B,A - LD HL,14 ; GET THE 'S2' BYTE (EXTRA EXTENT). - ADD HL,DE - LD A,(HL) - ADD A,A ; AND SHIFT IT LEFT 4 BITS (BITS 4-7). - ADD A,A - ADD A,A - ADD A,A - PUSH AF ; SAVE CARRY FLAG (BIT 0 OF FLAG BYTE). - ADD A,B ; NOW ADD EXTRA EXTENT INTO 'R1'. - LD B,A - PUSH AF ; AND SAVE CARRY (OVERFLOW BYTE 'R2'). - POP HL ; BIT 0 OF (L) IS THE OVERFLOW INDICATOR. - LD A,L - POP HL ; AND SAME FOR FIRST CARRY FLAG. - OR L ; EITHER ONE OF THESE SET? - AND 01H ; ONLY CHECK THE CARRY FLAGS. - RET -; -; ROUTINE TO SETUP THE FCB (BYTES 'R0', 'R1', 'R2') TO -; REFLECT THE LAST RECORD USED FOR A RANDOM (OR OTHER) FILE. -; THIS READS THE DIRECTORY AND LOOKS AT ALL EXTENTS COMPUTING -; THE LARGERST RECORD NUMBER FOR EACH AND KEEPING THE MAXIMUM -; VALUE ONLY. THEN 'R0', 'R1', AND 'R2' WILL REFLECT THIS -; MAXIMUM RECORD NUMBER. THIS IS USED TO COMPUTE THE SPACE USED -; BY A RANDOM FILE. -; -RANSIZE:LD C,12 ; LOOK THRU DIRECTORY FOR FIRST ENTRY WITH - CALL FINDFST ; THIS NAME. - LD HL,(PARAMS) ; ZERO OUT THE 'R0, R1, R2' BYTES. - LD DE,33 - ADD HL,DE - PUSH HL - LD (HL),D ; NOTE THAT (D)=0. - INC HL - LD (HL),D - INC HL - LD (HL),D -RANSIZ1:CALL CKFILPOS ; IS THERE AN EXTENT TO PROCESS? - JP Z,RANSIZ3 ; NO, WE ARE DONE. - CALL FCB2HL ; SET (HL) POINTING TO PROPER FCB IN DIR. - LD DE,15 ; POINT TO LAST RECORD IN EXTENT. - CALL COMPRAND ; AND COMPUTE RANDOM PARAMETERS. - POP HL - PUSH HL ; NOW CHECK THESE VALUES AGAINST THOSE - LD E,A ; ALREADY IN FCB. - LD A,C ; THE CARRY FLAG WILL BE SET IF THOSE - SUB (HL) ; IN THE FCB REPRESENT A LARGER SIZE THAN - INC HL ; THIS EXTENT DOES. - LD A,B - SBC A,(HL) - INC HL - LD A,E - SBC A,(HL) - JP C,RANSIZ2 - LD (HL),E ; WE FOUND A LARGER (IN SIZE) EXTENT. - DEC HL ; STUFF THESE VALUES INTO FCB. - LD (HL),B - DEC HL - LD (HL),C -RANSIZ2:CALL FINDNXT ; NOW GET THE NEXT EXTENT. - JP RANSIZ1 ; CONTINUE TIL ALL DONE. -RANSIZ3:POP HL ; WE ARE DONE, RESTORE THE STACK AND - RET ; RETURN. -; -; FUNCTION TO RETURN THE RANDOM RECORD POSITION OF A GIVEN -; FILE WHICH HAS BEEN READ IN S.EQUENTIAL MODE UP TO NOW. -; -SETRAN: LD HL,(PARAMS) ; POINT TO FCB. - LD DE,32 ; AND TO LAST USED RECORD. - CALL COMPRAND ; COMPUTE RANDOM POSITION. - LD HL,33 ; NOW STUFF THESE VALUES INTO FCB. - ADD HL,DE - LD (HL),C ; MOVE 'R0'. - INC HL - LD (HL),B ; AND 'R1'. - INC HL - LD (HL),A ; AND LASTLY 'R2'. - RET -; -; THIS ROUTINE SELECT THE DRIVE SPECIFIED IN (ACTIVE) AND -; UPDATE THE LOGIN VECTOR AND BITMAP TABLE IF THIS DRIVE WAS -; NOT ALREADY ACTIVE. -; -LOGINDRV: - LD HL,(LOGIN) ; GET THE LOGIN VECTOR. - LD A,(ACTIVE) ; GET THE DEFAULT DRIVE. - LD C,A - CALL SHIFTR ; POSITION ACTIVE BIT FOR THIS DRIVE - PUSH HL ; INTO BIT 0. - EX DE,HL - CALL SELECT ; SELECT THIS DRIVE. - POP HL - CALL Z,SLCTERR ; VALID DRIVE? - LD A,L ; IS THIS A NEWLY ACTIVATED DRIVE? - RRA - RET C - LD HL,(LOGIN) ; YES, UPDATE THE LOGIN VECTOR. - LD C,L - LD B,H - CALL SETBIT - LD (LOGIN),HL ; AND SAVE. - JP BITMAP ; NOW UPDATE THE BITMAP. -; -; FUNCTION TO SET THE ACTIVE DISK NUMBER. -; -SETDSK: LD A,(EPARAM) ; GET PARAMETER PASSED AND SEE IF THIS - LD HL,ACTIVE ; REPRESENTS A CHANGE IN DRIVES. - CP (HL) - RET Z - LD (HL),A ; YES IT DOES, LOG IT IN. - JP LOGINDRV -; -; THIS IS THE 'AUTO DISK SELECT' ROUTINE. THE FIRSST BYTE -; OF THE FCB IS EXAMINED FOR A DRIVE SPECIFICATION. IF NON -; ZERO THEN THE DRIVE WILL BE SELECTED AND LOGED IN. -; -AUTOSEL:LD A,0FFH ; SAY 'AUTO-SELECT ACTIVATED'. - LD (AUTO),A - LD HL,(PARAMS) ; GET DRIVE SPECIFIED. - LD A,(HL) - AND 1FH ; LOOK AT LOWER 5 BITS. - DEC A ; ADJUST FOR (1=A, 2=B) ETC. - LD (EPARAM),A ; AND SAVE FOR THE SELECT ROUTINE. - CP 1EH ; CHECK FOR 'NO CHANGE' CONDITION. - JP NC,AUTOSL1 ; YES, DON'T CHANGE. - LD A,(ACTIVE) ; WE MUST CHANGE, SAVE CURRENTLY ACTIVE - LD (OLDDRV),A ; DRIVE. - LD A,(HL) ; AND SAVE FIRST BYTE OF FCB ALSO. - LD (AUTOFLAG),A ; THIS MUST BE NON-ZERO. - AND 0E0H ; WHATS THIS FOR (BITS 6,7 ARE USED FOR - LD (HL),A ; SOMETHING)? - CALL SETDSK ; SELECT AND LOG IN THIS DRIVE. -AUTOSL1:LD A,(USERNO) ; MOVE USER NUMBER INTO FCB. - LD HL,(PARAMS) ; (* UPPER HALF OF FIRST BYTE *) - OR (HL) - LD (HL),A - RET ; AND RETURN (ALL DONE). -; -; FUNCTION TO RETURN THE CURRENT CP/M VERSION NUMBER. -; -GETVER: LD A,022H ; VERSION 2.2 - JP SETSTAT -; -; FUNCTION TO RESET THE DISK SYSTEM. -; -RSTDSK: LD HL,0 ; CLEAR WRITE PROTECT STATUS AND LOG - LD (WRTPRT),HL ; IN VECTOR. - LD (LOGIN),HL - XOR A ; SELECT DRIVE 'A'. - LD (ACTIVE),A - LD HL,TBUFF ; SETUP DEFAULT DMA ADDRESS. - LD (USERDMA),HL - CALL DEFDMA - JP LOGINDRV ; NOW LOG IN DRIVE 'A'. -; -; FUNCTION TO OPEN A SPECIFIED FILE. -; -OPENFIL:CALL CLEARS2 ; CLEAR 'S2' BYTE. - CALL AUTOSEL ; SELECT PROPER DISK. - JP OPENIT ; AND OPEN THE FILE. -; -; FUNCTION TO CLOSE A SPECIFIED FILE. -; -CLOSEFIL: - CALL AUTOSEL ; SELECT PROPER DISK. - JP CLOSEIT ; AND CLOSE THE FILE. -; -; FUNCTION TO RETURN THE FIRST OCCURENCE OF A SPECIFIED FILE -; NAME. IF THE FIRST BYTE OF THE FCB IS '?' THEN THE NAME WILL -; NOT BE CHECKED (GET THE FIRST ENTRY NO MATTER WHAT). -; -GETFST: LD C,0 ; PREPARE FOR SPECIAL SEARCH. - EX DE,HL - LD A,(HL) ; IS FIRST BYTE A '?'? - CP '?' - JP Z,GETFST1 ; YES, JUST GET VERY FIRST ENTRY (ZERO LENGTH MATCH). - CALL SETEXT ; GET THE EXTENSION BYTE FROM FCB. - LD A,(HL) ; IS IT '?'? IF YES, THEN WE WANT - CP '?' ; AN ENTRY WITH A SPECIFIC 'S2' BYTE. - CALL NZ,CLEARS2 ; OTHERWISE, LOOK FOR A ZERO 'S2' BYTE. - CALL AUTOSEL ; SELECT PROPER DRIVE. - LD C,15 ; COMPARE BYTES 0-14 IN FCB (12&13 EXCLUDED). -GETFST1:CALL FINDFST ; FIND AN ENTRY AND THEN MOVE IT INTO - JP MOVEDIR ; THE USERS DMA SPACE. -; -; FUNCTION TO RETURN THE NEXT OCCURENCE OF A FILE NAME. -; -GETNXT: LD HL,(SAVEFCB) ; RESTORE POINTERS. NOTE THAT NO - LD (PARAMS),HL ; OTHER .DBOS CALLS ARE ALLOWED. - CALL AUTOSEL ; NO ERROR WILL BE RETURNED, BUT THE - CALL FINDNXT ; RESULTS WILL BE WRONG. - JP MOVEDIR -; -; FUNCTION TO DELETE A FILE BY NAME. -; -DELFILE:CALL AUTOSEL ; SELECT PROPER DRIVE. - CALL ERAFILE ; ERASE THE FILE. - JP STSTATUS ; SET STATUS AND RETURN. -; -; FUNCTION TO EXECUTE A S.EQUENTIAL READ OF THE SPECIFIED -; RECORD NUMBER. -; -READSEQ:CALL AUTOSEL ; SELECT PROPER DRIVE THEN READ. - JP RDSEQ -; -; FUNCTION TO WRITE THE NET S.EQUENTIAL RECORD. -; -WRTSEQ: CALL AUTOSEL ; SELECT PROPER DRIVE THEN WRITE. - JP WTSEQ -; -; CREATE A FILE FUNCTION. -; -FCREATE:CALL CLEARS2 ; CLEAR THE 'S2' BYTE ON ALL CREATES. - CALL AUTOSEL ; SELECT PROPER DRIVE AND GET THE NEXT - JP GETEMPTY ; EMPTY DIRECTORY SPACE. -; -; FUNCTION TO RENAME A FILE. -; -RENFILE:CALL AUTOSEL ; SELECT PROPER DRIVE AND THEN SWITCH - CALL CHGNAMES ; FILE NAMES. - JP STSTATUS -; -; FUNCTION TO RETURN THE LOGIN VECTOR. -; -GETLOG: LD HL,(LOGIN) - JP GETPRM1 -; -; FUNCTION TO RETURN THE CURRENT DISK ASSIGNMENT. -; -GETCRNT:LD A,(ACTIVE) - JP SETSTAT -; -; FUNCTION TO SET THE DMA ADDRESS. -; -PUTDMA: EX DE,HL - LD (USERDMA),HL ; SAVE IN OUR SPACE AND THEN GET TO - JP DEFDMA ; THE BIOS WITH THIS ALSO. -; -; FUNCTION TO RETURN THE ALLOCATION VECTOR. -; -GETALOC:LD HL,(ALOCVECT) - JP GETPRM1 -; -; FUNCTION TO RETURN THE READ-ONLY STATUS VECTOR. -; -GETROV: LD HL,(WRTPRT) - JP GETPRM1 -; -; FUNCTION TO SET THE FILE ATTRIBUTES (READ-ONLY, SYSTEM). -; -SETATTR:CALL AUTOSEL ; SELECT PROPER DRIVE THEN SAVE ATTRIBUTES. - CALL SAVEATTR - JP STSTATUS -; -; FUNCTION TO RETURN THE ADDRESS OF THE DISK PARAMETER BLOCK -; FOR THE CURRENT DRIVE. -; -GETPARM:LD HL,(DISKPB) -GETPRM1:LD (STATUS),HL - RET -; -; FUNCTION TO GET OR SET THE USER NUMBER. IF (E) WAS (FF) -; THEN THIS IS A R.EQUEST TO RETURN THE CURRENT USER NUMBER. -; ELSE SET THE USER NUMBER FROM (E). -; -GETUSER:LD A,(EPARAM) ; GET PARAMETER. - CP 0FFH ; GET USER NUMBER? - JP NZ,SETUSER - LD A,(USERNO) ; YES, JUST DO IT. - JP SETSTAT -SETUSER:AND 1FH ; NO, WE SHOULD SET IT INSTEAD. KEEP LOW - LD (USERNO),A ; BITS (0-4) ONLY. - RET -; -; FUNCTION TO READ A RANDOM RECORD FROM A FILE. -; -RDRANDOM: - CALL AUTOSEL ; SELECT PROPER DRIVE AND READ. - JP READRAN -; -; FUNCTION TO COMPUTE THE FILE SIZE FOR RANDOM FILES. -; -WTRANDOM: - CALL AUTOSEL ; SELECT PROPER DRIVE AND WRITE. - JP WRITERAN -; -; FUNCTION TO COMPUTE THE SIZE OF A RANDOM FILE. -; -FILESIZE: - CALL AUTOSEL ; SELECT PROPER DRIVE AND CHECK FILE LENGTH - JP RANSIZE -; -; FUNCTION #37. THIS ALLOWS A PROGRAM TO LOG OFF ANY DRIVES. -; ON ENTRY, SET (DE) TO CONTAIN A WORD WITH BITS SET FOR THOSE -; DRIVES THAT ARE TO BE LOGGED OFF. THE LOG-IN VECTOR AND THE -; WRITE PROTECT VECTOR WILL BE UPDATED. THIS MUST BE A M/PM -; SPECIAL FUNCTION. -; -LOGOFF: LD HL,(PARAMS) ; GET DRIVES TO LOG OFF. - LD A,L ; FOR EACH BIT THAT IS SET, WE WANT - CPL ; TO CLEAR THAT BIT IN (LOGIN) - LD E,A ; AND (WRTPRT). - LD A,H - CPL - LD HL,(LOGIN) ; RESET THE LOGIN VECTOR. - AND H - LD D,A - LD A,L - AND E - LD E,A - LD HL,(WRTPRT) - EX DE,HL - LD (LOGIN),HL ; AND SAVE. - LD A,L ; NOW DO THE WRITE PROTECT VECTOR. - AND E - LD L,A - LD A,H - AND D - LD H,A - LD (WRTPRT),HL ; AND SAVE. ALL DONE. - RET -; -; GET HERE TO RETURN TO THE USER. -; -GOBACK: LD A,(AUTO) ; WAS AUTO SELECT ACTIVATED? - OR A - JP Z,GOBACK1 - LD HL,(PARAMS) ; YES, BUT WAS A CHANGE MADE? - LD (HL),0 ; (* RESET FIRST BYTE OF FCB *) - LD A,(AUTOFLAG) - OR A - JP Z,GOBACK1 - LD (HL),A ; YES, RESET FIRST BYTE PROPERLY. - LD A,(OLDDRV) ; AND GET THE OLD DRIVE AND SELECT IT. - LD (EPARAM),A - CALL SETDSK -GOBACK1:LD HL,(USRSTACK) ; RESET THE USERS STACK POINTER. - LD SP,HL - LD HL,(STATUS) ; GET RETURN STATUS. - LD A,L ; FORCE VERSION 1.4 COMPATABILITY. - LD B,H - RET ; AND GO BACK TO USER. -; -; FUNCTION #40. THIS IS A SPECIAL ENTRY TO DO RANDOM I/O. -; FOR THE CASE WHERE WE ARE WRITING TO UNUSED DISK SPACE, THIS -; SPACE WILL BE ZEROED OUT FIRST. THIS MUST BE A M/PM SPECIAL -; PURPOSE FUNCTION, BECAUSE WHY WOULD ANY NORMAL PROGRAM EVEN -; CARE ABOUT THE PREVIOUS CONTENTS OF A SECTOR ABOUT TO BE -; WRITTEN OVER. -; -WTSPECL:CALL AUTOSEL ; SELECT PROPER DRIVE. - LD A,2 ; USE SPECIAL WRITE MODE. - LD (MODE),A - LD C,0 ; SET WRITE INDICATOR. - CALL POSITN1 ; POSITION THE FILE. - CALL Z,WTSEQ1 ; AND WRITE (IF NO ERRORS). - RET -; -;************************************************************** -;* -;* BDOS DATA STORAGE POOL. -;* -;************************************************************** -; -EMPTYFCB: - .DB 0E5H ; EMPTY DIRECTORY SEGMENT INDICATOR. -WRTPRT: .DW 0 ; WRITE PROTECT STATUS FOR ALL 16 DRIVES. -LOGIN: .DW 0 ; DRIVE ACTIVE WORD (1 BIT PER DRIVE). -USERDMA:.DW 080H ; USER'S DMA ADDRESS (DEFAULTS TO 80H). -; -; SCRATCH AREAS FROM PARAMETER BLOCK. -; -SCRATCH1: - .DW 0 ; RELATIVE POSITION WITHIN DIR SEGMENT FOR FILE (0-3). -SCRATCH2: - .DW 0 ; LAST SELECTED TRACK NUMBER. -SCRATCH3: - .DW 0 ; LAST SELECTED SECTOR NUMBER. -; -; DISK STORAGE AREAS FROM PARAMETER BLOCK. -; -DIRBUF: .DW 0 ; ADDRESS OF DIRECTORY BUFFER TO USE. -DISKPB: .DW 0 ; CONTAINS ADDRESS OF DISK PARAMETER BLOCK. -CHKVECT:.DW 0 ; ADDRESS OF CHECK VECTOR. -ALOCVECT: - .DW 0 ; ADDRESS OF ALLOCATION VECTOR (BIT MAP). -; -; PARAMETER BLOCK RETURNED FROM THE BIOS. -; -SECTORS:.DW 0 ; SECTORS PER TRACK FROM BIOS. -BLKSHFT:.DB 0 ; BLOCK SHIFT. -BLKMASK:.DB 0 ; BLOCK MASK. -EXTMASK:.DB 0 ; EXTENT MASK. -DSKSIZE:.DW 0 ; DISK SIZE FROM BIOS (NUMBER OF BLOCKS-1). -DIRSIZE:.DW 0 ; DIRECTORY SIZE. -ALLOC0: .DW 0 ; STORAGE FOR FIRST BYTES OF BIT MAP (DIR SPACE USED). -ALLOC1: .DW 0 -OFFSET: .DW 0 ; FIRST USABLE TRACK NUMBER. -XLATE: .DW 0 ; SECTOR TRANSLATION TABLE ADDRESS. -; -; -CLOSEFLG: - .DB 0 ; CLOSE FLAG (=0FFH IS EXTENT WRITTEN OK). -R.DWRTFLG: - .DB 0 ; READ/WRITE FLAG (0FFH=READ, 0=WRITE). -FNDSTAT:.DB 0 ; FILENAME FOUND STATUS (0=FOUND FIRST ENTRY). -MODE: .DB 0 ; I/O MODE SELECT (0=RANDOM, 1=S.EQUENTIAL, 2=SPECIAL RANDOM). -EPARAM: .DB 0 ; STORAGE FOR REGISTER (E) ON ENTRY TO BDOS. -RELBLOCK: - .DB 0 ; RELATIVE POSITION WITHIN FCB OF BLOCK NUMBER WRITTEN. -COUNTER:.DB 0 ; BYTE COUNTER FOR DIRECTORY NAME SEARCHES. -SAVEFCB:.DW 0,0 ; SAVE SPACE FOR ADDRESS OF FCB (FOR DIRECTORY SEARCHES). -BIGDISK:.DB 0 ; IF =0 THEN DISK IS > 256 BLOCKS LONG. -AUTO: .DB 0 ; IF NON-ZERO, THEN AUTO SELECT ACTIVATED. -OLDDRV: .DB 0 ; ON AUTO SELECT, STORAGE FOR PREVIOUS DRIVE. -AUTOFLAG: - .DB 0 ; IF NON-ZERO, THEN AUTO SELECT CHANGED DRIVES. -SAVNXT: .DB 0 ; STORAGE FOR NEXT RECORD NUMBER TO ACCESS. -SAVEXT: .DB 0 ; STORAGE FOR EXTENT NUMBER OF FILE. -SAVNREC:.DW 0 ; STORAGE FOR NUMBER OF RECORDS IN FILE. -BLKNMBR:.DW 0 ; BLOCK NUMBER (PHYSICAL SECTOR) USED WITHIN A FILE OR LOGICAL SEC -LOGSECT:.DW 0 ; STARTING LOGICAL (128 BYTE) SECTOR OF BLOCK (PHYSICAL SECTOR). -FCBPOS: .DB 0 ; RELATIVE POSITION WITHIN BUFFER FOR FCB OF FILE OF INTEREST. -FILEPOS:.DW 0 ; FILES POSITION WITHIN DIRECTORY (0 TO MAX ENTRIES -1). -; -; DISK DIRECTORY BUFFER CHECKSUM BYTES. ONE FOR EACH OF THE -; 16 POSSIBLE DRIVES. -; -CKSUMTBL: - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -; -;************************************************************** -;* -;* B I O S J U M P T A B L E -;* -;************************************************************** -; - -BIOS: .EQU BIOSO ;BIOS ORIGIN -; -BOOT: .EQU BIOS ;(BOOT) Cold boot entry -WBOOT: .EQU BIOS+3 ;Warm boot entry -CONST: .EQU BIOS+6 ;Console status -CONIN: .EQU BIOS+9 ;Console char in -CONOUT: .EQU BIOS+12 ;Console char out -LIST: .EQU BIOS+15 ;List char out -PUNCH: .EQU BIOS+18 ;Punch char out -READER: .EQU BIOS+21 ;Reader char in -HOME: .EQU BIOS+24 ;Home disk -SELDSK: .EQU BIOS+27 ;Select disk -SETTRK: .EQU BIOS+30 ;Set disk track addr -SETSEC: .EQU BIOS+33 ;Set disk sector addr -SETDMA: .EQU BIOS+36 ;Set DMA buffer addr -READ: .EQU BIOS+39 ;Read sector -WRITE: .EQU BIOS+42 ;Write sector -SECTRN: .EQU BIOS+48 ;Sector translation routine -; - .IF ENDFIL - .ORG BDOSO+0DFFH - .DB 55H - .ENDIF - .END diff --git a/branches/dgg/cpurom/ref/n8-romim.ref b/branches/dgg/cpurom/ref/n8-romim.ref deleted file mode 100644 index 33dfdad8..00000000 Binary files a/branches/dgg/cpurom/ref/n8-romim.ref and /dev/null differ diff --git a/branches/dgg/cpurom/src/baseline.c b/branches/dgg/cpurom/src/baseline.c deleted file mode 100644 index 34b1b2c3..00000000 --- a/branches/dgg/cpurom/src/baseline.c +++ /dev/null @@ -1,68 +0,0 @@ -/* - * baseline.c - Diagnostic EPROM for the N8VEM SBC V2 - * - */ - -#include -#include -#include -#include "portab.h" -#include "sbcv2.h" -#include "ns16550.h" - -/* #include "cpmbdos.h" */ - -/* THESE ARE USED BY THE LIBRARY ROUTINES */ -char getchar(void) -{ -/* - struct BDOSCALL cread = { C_READ, { (unsigned int)0 } }; - return cpmbdos(&cread); -*/ - return 0; -} -void outchar(char c) -{ - if(c) ; -/* - struct BDOSCALL cwrite = { C_WRITE, { (unsigned int)c } }; - cpmbdos(&cwrite); -*/ -} - - -void xdisable(void) -{ -} - -void xenable(void) -{ -} - -void intmode(U8 xmode) -{ - if(xmode); -} - -int main(void) -{ - pMPCL_ROM = 0x80; - pMPCL_RAM = 0x81; - - memcpy(0,0x0E5,0x2000); - - pMPCL_ROM = 0x80; - pMPCL_RAM = 0x00; - - xdisable(); - intmode(1); - pMPCL_ROM = 0x00; - pMPCL_RAM = 0x00; - - memcpy(RAMTARG_CPM,ROMSTART_CPM,CCPSIZ_CPM); - - pMPCL_ROM = 0x80; - pMPCL_RAM = 0x00; - return (0); -} - diff --git a/branches/dgg/cpurom/src/bdosb01.s b/branches/dgg/cpurom/src/bdosb01.s deleted file mode 100644 index 1cb003b2..00000000 --- a/branches/dgg/cpurom/src/bdosb01.s +++ /dev/null @@ -1,2654 +0,0 @@ - .title bdosb01.s derived from bdosb01.asm - .sbttl by Douglas Goodall for N8VEM use '11 - - .module bdosb01 - .optsdcc -mz80 - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - .globl _bdos -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - .area _DATA -;-------------------------------------------------------- -; overlayable items in ram -;-------------------------------------------------------- - .area _OVERLAY -;-------------------------------------------------------- -; external initialized ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - .area _HOME - .area _GSINIT - .area _GSFINAL - .area _GSINIT -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - .area _HOME - .area _HOME -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - .area _CODE -;bdos.c:1: void bdos(void) -; --------------------------------- -; Function bdos -; --------------------------------- -_bdos_start:: -_bdos: - -;dwg-start; - .area _DATA -;dwg-end; - -ENDFIL = 1 ;FILL FULL BDOS LENGTH -; -IOBYTE = 3 ; I/O DEFINITION BYTE. -TDRIVE = 4 ; CURRENT DRIVE NAME AND USER NUMBER. -ENTRY = 5 ; ENTRY POINT FOR THE CP/M BDOS. -TFCB = 0x5C ; DEFAULT FILE CONTROL BLOCK. -TBUFF = 0x80 ; I/O BUFFER AND COMMAND LINE STORAGE. -TBASE = 0x100 ; TRANSIANT PROGRAM STORAGE AREA. -; -; SET CONTROL CHARACTER .EQUATES. -; -ASCIIA = 0x41 -AT = 0x40 -CNTRLC = 3 ; CONTROL-C -CNTRLE = 05 ; CONTROL-E -BS = 08 ; BACKSPACE -TAB = 09 ; TAB -LF = 0x0A ; LINE FEED -FF = 0x0C ; FORM FEED -CR = 0x0D ; CARRIAGE RETURN -CNTRLP = 0x10 ; CONTROL-P -CNTRLR = 0x12 ; CONTROL-R -CNTRLS = 0x13 ; CONTROL-S -CNTRLU = 0x15 ; CONTROL-U -CNTRLX = 0x18 ; CONTROL-X -CNTRLZ = 0x1A ; CONTROL-Z (END-OF-FILE MARK) -SPACE = 0x20 -POUND = 0x23 -DOLLAR = 0x24 -QUESTION = 0x3f -UP = 0x5E -DEL = 0x7F ; RUBOUT - -; CPM ORIGIN CALCULATE - -NK = 59 ;SYSTEM SIZE -BASE = (NK*1024)-0x5000 -CCPO = BASE+0x3400 ;CCP ORIGIN -BDOSO = BASE+0x3C00 ;BDOS ORIGIN -BIOSO = BASE+0x4A00 ;BIOS ORIGIN - -;dwg-begin; - -; .area _CODE - .area _BDOSB01 - -;dwg-end; - -;dwg; .ORG BDOSO - .DB 0,0,0,0,0,0 ;OLD SERIAL NUMBER -; -;************************************************************** -;* -;* B D O S E N T R Y -;* -;************************************************************** -; -FBASE: JP FBASE1 -; -; BDOS ERROR TABLE. -; -BADSCTR:.DW ERROR1 ; BAD SECTOR ON READ OR WRITE. -BADSLCT:.DW ERROR2 ; BAD DISK SELECT. -RODISK: .DW ERROR3 ; DISK IS READ ONLY. -ROFILE: .DW ERROR4 ; FILE IS READ ONLY. -; -; ENTRY INTO BDOS. (DE) OR (E) ARE THE PARAMETERS PASSED. THE -; FUNCTION NUMBER DESIRED IS IN REGISTER (C). -; E contains drive number if passing this -FBASE1: EX DE,HL ; SAVE THE (DE) PARAMETERS. - LD (PARAMS),HL - EX DE,HL - LD A,E ; AND SAVE REGISTER (E) IN PARTICULAR. - LD (EPARAM),A - LD HL,#0 - LD (STATUS),HL ; CLEAR RETURN STATUS. - ADD HL,SP - LD (USRSTACK),HL ; SAVE USERS STACK POINTER. - LD SP,#STKAREA ; AND SET OUR OWN. - XOR A ; CLEAR AUTO SELECT STORAGE SPACE. - LD (AUTOFLAG),A - LD (AUTO),A - LD HL,#GOBACK ; SET RETURN ADDRESS. - PUSH HL - LD A,C ; GET FUNCTION NUMBER. - CP #NFUNCTS ; VALID FUNCTION NUMBER? - RET NC - LD C,E ; KEEP SINGLE REGISTER FUNCTION HERE. - LD HL,#FUNCTNS ; NOW LOOK THRU THE FUNCTION TABLE. - LD E,A - LD D,#0 ; (DE)=FUNCTION NUMBER. - ADD HL,DE - ADD HL,DE ; (HL)=(START OF TABLE)+2*(FUNCTION NUMBER). - LD E,(HL) - INC HL - LD D,(HL) ; NOW (DE)=ADDRESS FOR THIS FUNCTION. - LD HL,(PARAMS) ; RETRIEVE PARAMETERS. - EX DE,HL ; NOW (DE) HAS THE ORIGINAL PARAMETERS. - JP (HL) ; EXECUTE DESIRED FUNCTION. -; -; BDOS FUNCTION JUMP TABLE. -; -NFUNCTS = 41 ; NUMBER OF FUNCTIONS IN FOLLOWIN TABLE. -; -FUNCTNS:.DW WBOOT,GETCON,OUTCON,GETRDR,PUNCH,LIST,DIRCIO,GETIOB - .DW SETIOB,PRTSTR,R.DBUFF,GETCSTS,GETVER,RSTDSK,SETDSK,OPENFIL - .DW CLOSEFIL,GETFST,GETNXT,DELFILE,READSEQ,WRTSEQ,FCREATE - .DW RENFILE,GETLOG,GETCRNT,PUTDMA,GETALOC,WRTPRTD,GETROV,SETATTR - .DW GETPARM,GETUSER,RDRANDOM,WTRANDOM,FILESIZE,SETRAN,LOGOFF,RTN - .DW RTN,WTSPECL -; -; BDOS ERROR MESSAGE SECTION. -; -ERROR1: LD HL,#BADSEC ; BAD SECTOR MESSAGE. - CALL PRTERR ; PRINT IT AND GET A 1 CHAR RESPONCE. - CP #CNTRLC ; RE-BOOT R.EQUEST (CONTROL-C)? - JP Z,0 ; YES. - RET ; NO, RETURN TO RETRY I/O FUNCTION. -; -ERROR2: LD HL,#BADSEL ; BAD DRIVE SELECTED. - JP ERROR5 -; -ERROR3: LD HL,#DISKRO ; DISK IS READ ONLY. - JP ERROR5 -; -ERROR4: LD HL,#FILERO ; FILE IS READ ONLY. -; -ERROR5: CALL PRTERR - JP 0 ; ALWAYS REBOOT ON THESE ERRORS. -; -BDOSERR: .ascii "BDOS ERR ON " -BDOSDRV: .ascii " : $" -BADSEC: .ascii "BAD SECTOR$" -BADSEL: .ascii "SELECT$" -FILERO: .ascii "FILE " -DISKRO: .ascii "R/O$" -; -; PRINT BDOS ERROR MESSAGE. -; -PRTERR: PUSH HL ; SAVE SECOND MESSAGE POINTER. - CALL OUTCRLF ; SEND (CR)(LF). - LD A,(ACTIVE) ; GET ACTIVE DRIVE. - ADD A,#ASCIIA ; MAKE ASCII. - LD (BDOSDRV),A ; AND PUT IN MESSAGE. - LD BC,#BDOSERR ; AND PRINT IT. - CALL PRTMESG - POP BC ; PRINT SECOND MESSAGE LINE NOW. - CALL PRTMESG -; -; GET AN INPUT CHARACTER. WE WILL CHECK OUR 1 CHARACTER -; BUFFER FIRST. THIS MAY BE SET BY THE CONSOLE STATUS ROUTINE. -; -GETCHAR:LD HL,#CHARBUF ; CHECK CHARACTER BUFFER. - LD A,(HL) ; ANYTHING PRESENT ALREADY? - LD (HL),#0 ; ...EITHER CASE CLEAR IT. - OR A - RET NZ ; YES, USE IT. - JP CONIN ; NOPE, GO GET A CHARACTER RESPONCE. -; -; INPUT AND ECHO A CHARACTER. -; -GETECHO:CALL GETCHAR ; INPUT A CHARACTER. - CALL CHKCHAR ; CARRIAGE CONTROL? - RET C ; NO, A REGULAR CONTROL CHAR SO DON'T ECHO. - PUSH AF ; OK, SAVE CHARACTER NOW. - LD C,A - CALL OUTCON ; AND ECHO IT. - POP AF ; GET CHARACTER AND RETURN. - RET -; -; CHECK CHARACTER IN (A). SET THE ZERO FLAG ON A CARRIAGE -; CONTROL CHARACTER AND THE CARRY FLAG ON ANY OTHER CONTROL -; CHARACTER. -; -CHKCHAR:CP #CR ; CHECK FOR CARRIAGE RETURN, LINE FEED, BACKSPACE, - RET Z ; OR A TAB. - CP #LF - RET Z - CP #TAB - RET Z - CP #BS - RET Z - CP #SPACE ; OTHER CONTROL CHAR? SET CARRY FLAG. - RET -; -; CHECK THE CONSOLE DURING OUTPUT. HALT ON A CONTROL-S, THEN -; REBOOT ON A CONTROL-C. IF ANYTHING ELSE IS READY, CLEAR THE -; ZERO FLAG AND RETURN (THE CALLING ROUTINE MAY WANT TO DO -; SOMETHING). -; -CKCONSOL: - LD A,(CHARBUF) ; CHECK BUFFER. - OR A ; IF ANYTHING, JUST RETURN WITHOUT CHECKING. - JP NZ,CKCON2 - CALL CONST ; NOTHING IN BUFFER. CHECK CONSOLE. - AND #0x01 ; LOOK AT BIT 0. - RET Z ; RETURN IF NOTHING. - CALL CONIN ; OK, GET IT. - CP #CNTRLS ; IF NOT CONTROL-S, RETURN WITH ZERO CLEARED. - JP NZ,CKCON1 - CALL CONIN ; HALT PROCESSING UNTIL ANOTHER CHAR - CP #CNTRLC ; IS TYPED. CONTROL-C? - JP Z,0 ; YES, REBOOT NOW. - XOR A ; NO, JUST PRETEND NOTHING WAS EVER READY. - RET -CKCON1: LD (CHARBUF),A ; SAVE CHARACTER IN BUFFER FOR LATER PROCESSING. -CKCON2: LD A,#1 ; SET (A) TO NON ZERO TO MEAN SOMETHING IS READY. - RET -; -; OUTPUT (C) TO THE SCREEN. IF THE PRINTER FLIP-FLOP FLAG -; IS SET, WE WILL SEND CHARACTER TO PRINTER ALSO. THE CONSOLE -; WILL BE CHECKED IN THE PROCESS. -; -OUTCHAR:LD A,(OUTFLAG) ; CHECK OUTPUT FLAG. - OR A ; ANYTHING AND WE WON'T GENERATE OUTPUT. - JP NZ,OUTCHR1 - PUSH BC - CALL CKCONSOL ; CHECK CONSOLE (WE DON'T CARE WHATS THERE). - POP BC - PUSH BC - CALL CONOUT ; OUTPUT (C) TO THE SCREEN. - POP BC - PUSH BC - LD A,(PRTFLAG) ; CHECK PRINTER FLIP-FLOP FLAG. - OR A - CALL NZ,LIST ; PRINT IT ALSO IF NON-ZERO. - POP BC -OUTCHR1:LD A,C ; UPDATE CURSORS POSITION. - LD HL,#CURPOS - CP #DEL ; RUBOUTS DON'T DO ANYTHING HERE. - RET Z - INC (HL) ; BUMP LINE POINTER. - CP #SPACE ; AND RETURN IF A NORMAL CHARACTER. - RET NC - DEC (HL) ; RESTORE AND CHECK FOR THE START OF THE LINE. - LD A,(HL) - OR A - RET Z ; INGNORE CONTROL CHARACTERS AT THE START OF THE LINE. - LD A,C - CP #BS ; IS IT A BACKSPACE? - JP NZ,OUTCHR2 - DEC (HL) ; YES, BACKUP POINTER. - RET -OUTCHR2:CP #LF ; IS IT A LINE FEED? - RET NZ ; IGNORE ANYTHING ELSE. - LD (HL),#0 ; RESET POINTER TO START OF LINE. - RET -; -; OUTPUT (A) TO THE SCREEN. IF IT IS A CONTROL CHARACTER -; (OTHER THAN CARRIAGE CONTROL), USE ^X FORMAT. -; -SHOWIT: LD A,C - CALL CHKCHAR ; CHECK CHARACTER. - JP NC,OUTCON ; NOT A CONTROL, USE NORMAL OUTPUT. - PUSH AF - LD C,#UP ; FOR A CONTROL CHARACTER, PRECEED IT WITH '^'. - CALL OUTCHAR - POP AF - OR #AT ; AND THEN USE THE LETTER .EQUIVELANT. - LD C,A -; -; FUNCTION TO OUTPUT (C) TO THE CONSOLE DEVICE AND EXPAND TABS -; IF NECESSARY. -; -OUTCON: LD A,C - CP #TAB ; IS IT A TAB? - JP NZ,OUTCHAR ; USE REGULAR OUTPUT. -OUTCON1:LD C,#SPACE ; YES IT IS, USE SPACES INSTEAD. - CALL OUTCHAR - LD A,(CURPOS) ; GO UNTIL THE CURSOR IS AT A MULTIPLE OF 8 - - AND #7 ; POSITION. - JP NZ,OUTCON1 - RET -; -; ECHO A BACKSPACE CHARACTER. ERASE THE PREVOIUS CHARACTER -; ON THE SCREEN. -; -BACKUP: CALL BACKUP1 ; BACKUP THE SCREEN 1 PLACE. - LD C,#SPACE ; THEN BLANK THAT CHARACTER. - CALL CONOUT -BACKUP1:LD C,#BS ; THEN BACK SPACE ONCE MORE. - JP CONOUT -; -; SIGNAL A DELETED LINE. PRINT A '#' AT THE END AND START -; OVER. -; -NEWLINE:LD C,#POUND - CALL OUTCHAR ; PRINT THIS. - CALL OUTCRLF ; START NEW LINE. -NEWLN1: LD A,(CURPOS) ; MOVE THE CURSOR TO THE STARTING POSITION. - LD HL,#STARTING - CP (HL) - RET NC ; THERE YET? - LD C,#SPACE - CALL OUTCHAR ; NOPE, KEEP GOING. - JP NEWLN1 -; -; OUTPUT A (CR) (LF) TO THE CONSOLE DEVICE (SCREEN). -; -OUTCRLF:LD C,#CR - CALL OUTCHAR - LD C,#LF - JP OUTCHAR -; -; PRINT MESSAGE POINTED TO BY (BC). IT WILL END WITH A '$'. -; -PRTMESG:LD A,(BC) ; CHECK FOR TERMINATING CHARACTER. - CP #DOLLAR - RET Z - INC BC - PUSH BC ; OTHERWISE, BUMP POINTER AND PRINT IT. - LD C,A - CALL OUTCON - POP BC - JP PRTMESG -; -; FUNCTION TO EXECUTE A BUFFERED READ. -; -R.DBUFF: LD A,(CURPOS) ; USE PRESENT LOCATION AS STARTING ONE. - LD (STARTING),A - LD HL,(PARAMS) ; GET THE MAXIMUM BUFFER SPACE. - LD C,(HL) - INC HL ; POINT TO FIRST AVAILABLE SPACE. - PUSH HL ; AND SAVE. - LD B,#0 ; KEEP A CHARACTER COUNT. -R.DBUF1: PUSH BC - PUSH HL -R.DBUF2: CALL GETCHAR ; GET THE NEXT INPUT CHARACTER. - AND #0x7F ; STRIP BIT 7. - POP HL ; RESET REGISTERS. - POP BC - CP #CR ; EN OF THE LINE? - JP Z,R.DBUF17 - CP #LF - JP Z,R.DBUF17 - CP #BS ; HOW ABOUT A BACKSPACE? - JP NZ,R.DBUF3 - LD A,B ; YES, BUT IGNORE AT THE BEGINNING OF THE LINE. - OR A - JP Z,R.DBUF1 - DEC B ; OK, UPDATE COUNTER. - LD A,(CURPOS) ; IF WE BACKSPACE TO THE START OF THE LINE, - LD (OUTFLAG),A ; TREAT AS A CANCEL (CONTROL-X). - JP R.DBUF10 -R.DBUF3: CP #DEL ; USER TYPED A RUBOUT? - JP NZ,R.DBUF4 - LD A,B ; IGNORE AT THE START OF THE LINE. - OR A - JP Z,R.DBUF1 - LD A,(HL) ; OK, ECHO THE PREVOIUS CHARACTER. - DEC B ; AND RESET POINTERS (COUNTERS). - DEC HL - JP R.DBUF15 -R.DBUF4: CP #CNTRLE ; PHYSICAL END OF LINE? - JP NZ,R.DBUF5 - PUSH BC ; YES, DO IT. - PUSH HL - CALL OUTCRLF - XOR A ; AND UPDATE STARTING POSITION. - LD (STARTING),A - JP R.DBUF2 -R.DBUF5: CP #CNTRLP ; CONTROL-P? - JP NZ,R.DBUF6 - PUSH HL ; YES, FLIP THE PRINT FLAG FILP-FLOP BYTE. - LD HL,#PRTFLAG - LD A,#1 ; PRTFLAG=1-PRTFLAG - SUB (HL) - LD (HL),A - POP HL - JP R.DBUF1 -R.DBUF6: CP #CNTRLX ; CONTROL-X (CANCEL)? - JP NZ,R.DBUF8 - POP HL -R.DBUF7: LD A,(STARTING) ; YES, BACKUP THE CURSOR TO HERE. - LD HL,#CURPOS - CP (HL) - JP NC,R.DBUFF ; DONE YET? - DEC (HL) ; NO, DECREMENT POINTER AND OUTPUT BACK UP ONE SPACE. - CALL BACKUP - JP R.DBUF7 -R.DBUF8: CP #CNTRLU ; CNTROL-U (CANCEL LINE)? - JP NZ,R.DBUF9 - CALL NEWLINE ; START A NEW LINE. - POP HL - JP R.DBUFF -R.DBUF9: CP #CNTRLR ; CONTROL-R? - JP NZ,R.DBUF14 -R.DBUF10:PUSH BC ; YES, START A NEW LINE AND RETYPE THE OLD ONE. - CALL NEWLINE - POP BC - POP HL - PUSH HL - PUSH BC -R.DBUF11:LD A,B ; DONE WHOLE LINE YET? - OR A - JP Z,R.DBUF12 - INC HL ; NOPE, GET NEXT CHARACTER. - LD C,(HL) - DEC B ; COUNT IT. - PUSH BC - PUSH HL - CALL SHOWIT ; AND DISPLAY IT. - POP HL - POP BC - JP R.DBUF11 -R.DBUF12:PUSH HL ; DONE WITH LINE. IF WE WERE DISPLAYING - LD A,(OUTFLAG) ; THEN UPDATE CURSOR POSITION. - OR A - JP Z,R.DBUF2 - LD HL,#CURPOS ; BECAUSE THIS LINE IS SHORTER, WE MUST - SUB (HL) ; BACK UP THE CURSOR (NOT THE SCREEN HOWEVER) - LD (OUTFLAG),A ; SOME NUMBER OF POSITIONS. -R.DBUF13:CALL BACKUP ; NOTE THAT AS LONG AS (OUTFLAG) IS NON - LD HL,#OUTFLAG ; ZERO, THE SCREEN WILL NOT BE CHANGED. - DEC (HL) - JP NZ,R.DBUF13 - JP R.DBUF2 ; NOW JUST GET THE NEXT CHARACTER. -; -; JUST A NORMAL CHARACTER, PUT THIS IN OUR BUFFER AND ECHO. -; -R.DBUF14:INC HL - LD (HL),A ; STORE CHARACTER. - INC B ; AND COUNT IT. -R.DBUF15:PUSH BC - PUSH HL - LD C,A ; ECHO IT NOW. - CALL SHOWIT - POP HL - POP BC - LD A,(HL) ; WAS IT AN ABORT R.EQUEST? - CP #CNTRLC ; CONTROL-C ABORT? - LD A,B - JP NZ,R.DBUF16 - CP #1 ; ONLY IF AT START OF LINE. - JP Z,0 -R.DBUF16:CP C ; NOPE, HAVE WE FILLED THE BUFFER? - JP C,R.DBUF1 -R.DBUF17:POP HL ; YES END THE LINE AND RETURN. - LD (HL),B - LD C,#CR - JP OUTCHAR ; OUTPUT (CR) AND RETURN. -; -; FUNCTION TO GET A CHARACTER FROM THE CONSOLE DEVICE. -; -GETCON: CALL GETECHO ; GET AND ECHO. - JP SETSTAT ; SAVE STATUS AND RETURN. -; -; FUNCTION TO GET A CHARACTER FROM THE TAPE READER DEVICE. -; -GETRDR: CALL READER ; GET A CHARACTER FROM READER, SET STATUS AND RETURN. - JP SETSTAT -; -; FUNCTION TO PERFORM DIRECT CONSOLE I/O. IF (C) CONTAINS (FF) -; THEN THIS IS AN INPUT R.EQUEST. IF (C) CONTAINS (FE) THEN -; THIS IS A STATUS R.EQUEST. OTHERWISE WE ARE TO OUTPUT (C). -; -DIRCIO: LD A,C ; TEST FOR (FF). - INC A - JP Z,DIRC1 - INC A ; TEST FOR (FE). - JP Z,CONST - JP CONOUT ; JUST OUTPUT (C). -DIRC1: CALL CONST ; THIS IS AN INPUT R.EQUEST. - OR A - JP Z,GOBACK1 ; NOT READY? JUST RETURN (DIRECTLY). - CALL CONIN ; YES, GET CHARACTER. - JP SETSTAT ; SET STATUS AND RETURN. -; -; FUNCTION TO RETURN THE I/O BYTE. -; -GETIOB: LD A,(IOBYTE) - JP SETSTAT -; -; FUNCTION TO SET THE I/O BYTE. -; -SETIOB: LD HL,#IOBYTE - LD (HL),C - RET -; -; FUNCTION TO PRINT THE CHARACTER STRING POINTED TO BY (DE) -; ON THE CONSOLE DEVICE. THE STRING ENDS WITH A '$'. -; -PRTSTR: EX DE,HL - LD C,L - LD B,H ; NOW (BC) POINTS TO IT. - JP PRTMESG -; -; FUNCTION TO INTERIGATE THE CONSOLE DEVICE. -; -GETCSTS:CALL CKCONSOL -; -; GET HERE TO SET THE STATUS AND RETURN TO THE CLEANUP -; SECTION. THEN BACK TO THE USER. -; -SETSTAT:LD (STATUS),A -RTN: RET -; -; SET THE STATUS TO 1 (READ OR WRITE ERROR CODE). -; -IOERR1: LD A,#1 - JP SETSTAT -; -OUTFLAG:.DB 0 ; OUTPUT FLAG (NON ZERO MEANS NO OUTPUT). -STARTING: - .DB 2 ; STARTING POSITION FOR CURSOR. -CURPOS: .DB 0 ; CURSOR POSITION (0=START OF LINE). -PRTFLAG:.DB 0 ; PRINTER FLAG (CONTROL-P TOGGLE). LIST IF NON ZERO. -CHARBUF:.DB 0 ; SINGLE INPUT CHARACTER BUFFER. -; -; STACK AREA FOR BDOS CALLS. -; -USRSTACK: - .DW 0 ; SAVE USERS STACK POINTER HERE. -; - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -STKAREA: ; END OF STACK AREA. -; -USERNO: .DB 0 ; CURRENT USER NUMBER. -ACTIVE: .DB 0 ; CURRENTLY ACTIVE DRIVE. -PARAMS: .DW 0 ; SAVE (DE) PARAMETERS HERE ON ENTRY. -STATUS: .DW 0 ; STATUS RETURNED FROM BDOS FUNCTION. -; -; SELECT ERROR OCCURED, JUMP TO ERROR ROUTINE. -; -SLCTERR:LD HL,#BADSLCT -; -; JUMP TO (HL) INDIRECTLY. -; -JUMPHL: LD E,(HL) - INC HL - LD D,(HL) ; NOW (DE) CONTAIN THE DESIRED ADDRESS. - EX DE,HL - JP (HL) -; -; BLOCK MOVE. (DE) TO (HL), (C) BYTES TOTAL. -; -DE2HL: INC C ; IS COUNT DOWN TO ZERO? -DE2HL1: DEC C - RET Z ; YES, WE ARE DONE. - LD A,(DE) ; NO, MOVE ONE MORE BYTE. - LD (HL),A - INC DE - INC HL - JP DE2HL1 ; AND REPEAT. -; -; SELECT THE DESIRED DRIVE. -; -SELECT: LD A,(ACTIVE) ; GET ACTIVE DISK. - LD C,A - CALL SELDSK ; SELECT IT. - LD A,H ; VALID DRIVE? - OR L ; VALID DRIVE? - RET Z ; RETURN IF NOT. -; -; HERE, THE BIOS RETURNED THE ADDRESS OF THE PARAMETER BLOCK -; IN (HL). WE WILL EXTRACT THE NECESSARY POINTERS AND SAVE THEM. -; - LD E,(HL) ; YES, GET ADDRESS OF TRANSLATION TABLE INTO (DE). - INC HL - LD D,(HL) - INC HL - LD (SCRATCH1),HL ; SAVE POINTERS TO SCRATCH AREAS. - INC HL - INC HL - LD (SCRATCH2),HL ; DITTO. - INC HL - INC HL - LD (SCRATCH3),HL ; DITTO. - INC HL - INC HL - EX DE,HL ; NOW SAVE THE TRANSLATION TABLE ADDRESS. - LD (XLATE),HL - LD HL,#DIRBUF ; PUT THE NEXT 8 BYTES HERE. - LD C,#8 ; THEY CONSIST OF THE DIRECTORY BUFFER - CALL DE2HL ; POINTER, PARAMETER BLOCK POINTER, - LD HL,(DISKPB) ; CHECK AND ALLOCATION VECTORS. - EX DE,HL - LD HL,#SECTORS ; MOVE PARAMETER BLOCK INTO OUR RAM. - LD C,#15 ; IT IS 15 BYTES LONG. - CALL DE2HL - LD HL,(DSKSIZE) ; CHECK DISK SIZE. - LD A,H ; MORE THAN 256 BLOCKS ON THIS? - LD HL,#BIGDISK - LD (HL),#0x0FF ; SET TO SAMLL. - OR A - JP Z,SELECT1 - LD (HL),#0 ; WRONG, SET TO LARGE. -SELECT1:LD A,#0x0FF ; CLEAR THE ZERO FLAG. - OR A - RET -; -; ROUTINE TO HOME THE DISK TRACK HEAD AND CLEAR POINTERS. -; -HOMEDRV:CALL HOME ; HOME THE HEAD. - XOR A - LD HL,(SCRATCH2) ; SET OUR TRACK POINTER ALSO. - LD (HL),A - INC HL - LD (HL),A - LD HL,(SCRATCH3) ; AND OUR SECTOR POINTER. - LD (HL),A - INC HL - LD (HL),A - RET -; -; DO THE ACTUAL DISK READ AND CHECK THE ERROR RETURN STATUS. -; -DOREAD: CALL READ - JP IORET -; -; DO THE ACTUAL DISK WRITE AND HANDLE ANY BIOS ERROR. -; -DOWRITE:CALL WRITE -IORET: OR A - RET Z ; RETURN UNLESS AN ERROR OCCURED. - LD HL,#BADSCTR ; BAD READ/WRITE ON THIS SECTOR. - JP JUMPHL -; -; ROUTINE TO SELECT THE TRACK AND SECTOR THAT THE DESIRED -; BLOCK NUMBER FALLS IN. -; -TRKSEC: LD HL,(FILEPOS) ; GET POSITION OF LAST ACCESSED FILE - LD C,#2 ; IN DIRECTORY AND COMPUTE SECTOR #. - CALL SHIFTR ; SECTOR #=FILE-POSITION/4. - LD (BLKNMBR),HL ; SAVE THIS AS THE BLOCK NUMBER OF INTEREST. - LD (CKSUMTBL),HL ; WHAT'S IT DOING HERE TOO? -; -; IF THE SECTOR NUMBER HAS ALREADY BEEN SET (BLKNMBR), ENTER -; AT THIS POINT. -; -TRKSEC1:LD HL,#BLKNMBR - LD C,(HL) ; MOVE SECTOR NUMBER INTO (BC). - INC HL - LD B,(HL) - LD HL,(SCRATCH3) ; GET CURRENT SECTOR NUMBER AND - LD E,(HL) ; MOVE THIS INTO (DE). - INC HL - LD D,(HL) - LD HL,(SCRATCH2) ; GET CURRENT TRACK NUMBER. - LD A,(HL) ; AND THIS INTO (HL). - INC HL - LD H,(HL) - LD L,A -TRKSEC2:LD A,C ; IS DESIRED SECTOR BEFORE CURRENT ONE? - SUB E - LD A,B - SBC A,D - JP NC,TRKSEC3 - PUSH HL ; YES, DECREMENT SECTORS BY ONE TRACK. - LD HL,(SECTORS) ; GET SECTORS PER TRACK. - LD A,E - SUB L - LD E,A - LD A,D - SBC A,H - LD D,A ; NOW WE HAVE BACKED UP ONE FULL TRACK. - POP HL - DEC HL ; ADJUST TRACK COUNTER. - JP TRKSEC2 -TRKSEC3:PUSH HL ; DESIRED SECTOR IS AFTER CURRENT ONE. - LD HL,(SECTORS) ; GET SECTORS PER TRACK. - ADD HL,DE ; BUMP SECTOR POINTER TO NEXT TRACK. - JP C,TRKSEC4 - LD A,C ; IS DESIRED SECTOR NOW BEFORE CURRENT ONE? - SUB L - LD A,B - SBC A,H - JP C,TRKSEC4 - EX DE,HL ; NOT YES, INCREMENT TRACK COUNTER - POP HL ; AND CONTINUE UNTIL IT IS. - INC HL - JP TRKSEC3 -; -; HERE WE HAVE DETERMINED THE TRACK NUMBER THAT CONTAINS THE -; DESIRED SECTOR. -; -TRKSEC4:POP HL ; GET TRACK NUMBER (HL). - PUSH BC - PUSH DE - PUSH HL - EX DE,HL - LD HL,(OFFSET) ; ADJUST FOR FIRST TRACK OFFSET. - ADD HL,DE - LD B,H - LD C,L - CALL SETTRK ; SELECT THIS TRACK. - POP DE ; RESET CURRENT TRACK POINTER. - LD HL,(SCRATCH2) - LD (HL),E - INC HL - LD (HL),D - POP DE - LD HL,(SCRATCH3) ; RESET THE FIRST SECTOR ON THIS TRACK. - LD (HL),E - INC HL - LD (HL),D - POP BC - LD A,C ; NOW SUBTRACT THE DESIRED ONE. - SUB E ; TO MAKE IT RELATIVE (1-# SECTORS/TRACK). - LD C,A - LD A,B - SBC A,D - LD B,A - LD HL,(XLATE) ; TRANSLATE THIS SECTOR ACCORDING TO THIS TABLE. - EX DE,HL - CALL SECTRN ; LET THE BIOS TRANSLATE IT. - LD C,L - LD B,H - JP SETSEC ; AND SELECT IT. -; -; COMPUTE BLOCK NUMBER FROM RECORD NUMBER (SAVNREC) AND -; EXTENT NUMBER (SAVEXT). -; -GETBLOCK: - LD HL,#BLKSHFT ; GET LOGICAL TO PHYSICAL CONVERSION. - LD C,(HL) ; NOTE THAT THIS IS BASE 2 LOG OF RATIO. - LD A,(SAVNREC) ; GET RECORD NUMBER. -GETBLK1:OR A ; COMPUTE (A)=(A)/2^BLKSHFT. - RRA - DEC C - JP NZ,GETBLK1 - LD B,A ; SAVE RESULT IN (B). - LD A,#8 - SUB (HL) - LD C,A ; COMPUTE (C)=8-BLKSHFT. - LD A,(SAVEXT) -GETBLK2:DEC C ; COMPUTE (A)=SAVEXT*2^(8-BLKSHFT). - JP Z,GETBLK3 - OR A - RLA - JP GETBLK2 -GETBLK3:ADD A,B - RET -; -; ROUTINE TO EXTRACT THE (BC) BLOCK BYTE FROM THE FCB POINTED -; TO BY (PARAMS). IF THIS IS A BIG-DISK, THEN THESE ARE 16 BIT -; BLOCK NUMBERS, ELSE THEY ARE 8 BIT NUMBERS. -; NUMBER IS RETURNED IN (HL). -; -EXTBLK: LD HL,(PARAMS) ; GET FCB ADDRESS. - LD DE,#16 ; BLOCK NUMBERS START 16 BYTES INTO FCB. - ADD HL,DE - ADD HL,BC - LD A,(BIGDISK) ; ARE WE USING A BIG-DISK? - OR A - JP Z,EXTBLK1 - LD L,(HL) ; NO, EXTRACT AN 8 BIT NUMBER FROM THE FCB. - LD H,#0 - RET -EXTBLK1:ADD HL,BC ; YES, EXTRACT A 16 BIT NUMBER. - LD E,(HL) - INC HL - LD D,(HL) - EX DE,HL ; RETURN IN (HL). - RET -; -; COMPUTE BLOCK NUMBER. -; -COMBLK: CALL GETBLOCK - LD C,A - LD B,#0 - CALL EXTBLK - LD (BLKNMBR),HL - RET -; -; CHECK FOR A ZERO BLOCK NUMBER (UNUSED). -; -CHKBLK: LD HL,(BLKNMBR) - LD A,L ; IS IT ZERO? - OR H - RET -; -; ADJUST PHYSICAL BLOCK (BLKNMBR) AND CONVERT TO LOGICAL -; SECTOR (LOGSECT). THIS IS THE STARTING SECTOR OF THIS BLOCK. -; THE ACTUAL SECTOR OF INTEREST IS THEN ADDED TO THIS AND THE -; RESULTING SECTOR NUMBER IS STORED BACK IN (BLKNMBR). THIS -; WILL STILL HAVE TO BE ADJUSTED FOR THE TRACK NUMBER. -; -LOGICAL:LD A,(BLKSHFT) ; GET LOG2(PHYSICAL/LOGICAL SECTORS). - LD HL,(BLKNMBR) ; GET PHYSICAL SECTOR DESIRED. -LOGICL1:ADD HL,HL ; COMPUTE LOGICAL SECTOR NUMBER. - DEC A ; NOTE LOGICAL SECTORS ARE 128 BYTES LONG. - JP NZ,LOGICL1 - LD (LOGSECT),HL ; SAVE LOGICAL SECTOR. - LD A,(BLKMASK) ; GET BLOCK MASK. - LD C,A - LD A,(SAVNREC) ; GET NEXT SECTOR TO ACCESS. - AND C ; EXTRACT THE RELATIVE POSITION WITHIN PHYSICAL BLOCK. - OR L ; AND ADD IT TOO LOGICAL SECTOR. - LD L,A - LD (BLKNMBR),HL ; AND STORE. - RET -; -; SET (HL) TO POINT TO EXTENT BYTE IN FCB. -; -SETEXT: LD HL,(PARAMS) - LD DE,#12 ; IT IS THE TWELTH BYTE. - ADD HL,DE - RET -; -; SET (HL) TO POINT TO RECORD COUNT BYTE IN FCB AND (DE) TO -; NEXT RECORD NUMBER BYTE. -; -SETHLDE:LD HL,(PARAMS) - LD DE,#15 ; RECORD COUNT BYTE (#15). - ADD HL,DE - EX DE,HL - LD HL,#17 ; NEXT RECORD NUMBER (#32). - ADD HL,DE - RET -; -; SAVE CURRENT FILE DATA FROM FCB. -; -STRDATA:CALL SETHLDE - LD A,(HL) ; GET AND STORE RECORD COUNT BYTE. - LD (SAVNREC),A - EX DE,HL - LD A,(HL) ; GET AND STORE NEXT RECORD NUMBER BYTE. - LD (SAVNXT),A - CALL SETEXT ; POINT TO EXTENT BYTE. - LD A,(EXTMASK) ; GET EXTENT MASK. - AND (HL) - LD (SAVEXT),A ; AND SAVE EXTENT HERE. - RET -; -; SET THE NEXT RECORD TO ACCESS. IF (MODE) IS SET TO 2, THEN -; THE LAST RECORD BYTE (SAVNREC) HAS THE CORRECT NUMBER TO ACCESS. -; FOR S.EQUENTIAL ACCESS, (MODE) WILL BE .EQUAL TO 1. -; -SETNREC:CALL SETHLDE - LD A,(MODE) ; GET S.EQUENTIAL FLAG (=1). - CP #2 ; A 2 INDICATES THAT NO ADDER IS NEEDED. - JP NZ,STNREC1 - XOR A ; CLEAR ADDER (RANDOM ACCESS?). -STNREC1:LD C,A - LD A,(SAVNREC) ; GET LAST RECORD NUMBER. - ADD A,C ; INCREMENT RECORD COUNT. - LD (HL),A ; AND SET FCB'S NEXT RECORD BYTE. - EX DE,HL - LD A,(SAVNXT) ; GET NEXT RECORD BYTE FROM STORAGE. - LD (HL),A ; AND PUT THIS INTO FCB AS NUMBER OF RECORDS USED. - RET -; -; SHIFT (HL) RIGHT (C) BITS. -; -SHIFTR: INC C -SHIFTR1:DEC C - RET Z - LD A,H - OR A - RRA - LD H,A - LD A,L - RRA - LD L,A - JP SHIFTR1 -; -; COMPUTE THE CHECK-SUM FOR THE DIRECTORY BUFFER. RETURN -; INTEGER SUM IN (A). -; -CHECKSUM: - LD C,#128 ; LENGTH OF BUFFER. - LD HL,(DIRBUF) ; GET ITS LOCATION. - XOR A ; CLEAR SUMMATION BYTE. -CHKSUM1:ADD A,(HL) ; AND COMPUTE SUM IGNORING CARRIES. - INC HL - DEC C - JP NZ,CHKSUM1 - RET -; -; SHIFT (HL) LEFT (C) BITS. -; -SHIFTL: INC C -SHIFTL1:DEC C - RET Z - ADD HL,HL ; SHIFT LEFT 1 BIT. - JP SHIFTL1 -; -; ROUTINE TO SET A BIT IN A 16 BIT VALUE CONTAINED IN (BC). -; THE BIT SET DEPENDS ON THE CURRENT DRIVE SELECTION. -; -SETBIT: PUSH BC ; SAVE 16 BIT WORD. - LD A,(ACTIVE) ; GET ACTIVE DRIVE. - LD C,A - LD HL,#1 - CALL SHIFTL ; SHIFT BIT 0 INTO PLACE. - POP BC ; NOW 'OR' THIS WITH THE ORIGINAL WORD. - LD A,C - OR L - LD L,A ; LOW BYTE DONE, DO HIGH BYTE. - LD A,B - OR H - LD H,A - RET -; -; EXTRACT THE WRITE PROTECT STATUS BIT FOR THE CURRENT DRIVE. -; THE RESULT IS RETURNED IN (A), BIT 0. -; -GETWPRT:LD HL,(WRTPRT) ; GET STATUS BYTES. - LD A,(ACTIVE) ; WHICH DRIVE IS CURRENT? - LD C,A - CALL SHIFTR ; SHIFT STATUS SUCH THAT BIT 0 IS THE - LD A,L ; ONE OF INTEREST FOR THIS DRIVE. - AND #1 ; AND ISOLATE IT. - RET -; -; FUNCTION TO WRITE PROTECT THE CURRENT DISK. -; -WRTPRTD:LD HL,#WRTPRT ; POINT TO STATUS WORD. - LD C,(HL) ; SET (BC) .EQUAL TO THE STATUS. - INC HL - LD B,(HL) - CALL SETBIT ; AND SET THIS BIT ACCORDING TO CURRENT DRIVE. - LD (WRTPRT),HL ; THEN SAVE. - LD HL,(DIRSIZE) ; NOW SAVE DIRECTORY SIZE LIMIT. - INC HL ; REMEMBER THE LAST ONE. - EX DE,HL - LD HL,(SCRATCH1) ; AND STORE IT HERE. - LD (HL),E ; PUT LOW BYTE. - INC HL - LD (HL),D ; THEN HIGH BYTE. - RET -; -; CHECK FOR A READ ONLY FILE. -; -CHKROFL:CALL FCB2HL ; SET (HL) TO FILE ENTRY IN DIRECTORY BUFFER. -CKROF1: LD DE,#9 ; LOOK AT BIT 7 OF THE NINTH BYTE. - ADD HL,DE - LD A,(HL) - RLA - RET NC ; RETURN IF OK. - LD HL,#ROFILE ; ELSE, PRINT ERROR MESSAGE AND TERMINATE. - JP JUMPHL -; -; CHECK THE WRITE PROTECT STATUS OF THE ACTIVE DISK. -; -CHKWPRT:CALL GETWPRT - RET Z ; RETURN IF OK. - LD HL,#RODISK ; ELSE PRINT MESSAGE AND TERMINATE. - JP JUMPHL -; -; ROUTINE TO SET (HL) POINTING TO THE PROPER ENTRY IN THE -; DIRECTORY BUFFER. -; -FCB2HL: LD HL,(DIRBUF) ; GET ADDRESS OF BUFFER. - LD A,(FCBPOS) ; RELATIVE POSITION OF FILE. -; -; ROUTINE TO ADD (A) TO (HL). -; -ADDA2HL:ADD A,L - LD L,A - RET NC - INC H ; TAKE CARE OF ANY CARRY. - RET -; -; ROUTINE TO GET THE 'S2' BYTE FROM THE FCB SUPPLIED IN -; THE INITIAL PARAMETER SPECIFICATION. -; -GETS2: LD HL,(PARAMS) ; GET ADDRESS OF FCB. - LD DE,#14 ; RELATIVE POSITION OF 'S2'. - ADD HL,DE - LD A,(HL) ; EXTRACT THIS BYTE. - RET -; -; CLEAR THE 'S2' BYTE IN THE FCB. -; -CLEARS2:CALL GETS2 ; THIS SETS (HL) POINTING TO IT. - LD (HL),#0 ; NOW CLEAR IT. - RET -; -; SET BIT 7 IN THE 'S2' BYTE OF THE FCB. -; -SETS2B7:CALL GETS2 ; GET THE BYTE. - OR #0x80 ; AND SET BIT 7. - LD (HL),A ; THEN STORE. - RET -; -; COMPARE (FILEPOS) WITH (SCRATCH1) AND SET FLAGS BASED ON -; THE DIFFERENCE. THIS CHECKS TO SEE IF THERE ARE MORE FILE -; NAMES IN THE DIRECTORY. WE ARE AT (FILEPOS) AND THERE ARE -; (SCRATCH1) OF THEM TO CHECK. -; -MOREFLS:LD HL,(FILEPOS) ; WE ARE HERE. - EX DE,HL - LD HL,(SCRATCH1) ; AND DON'T GO PAST HERE. - LD A,E ; COMPUTE DIFFERENCE BUT DON'T KEEP. - SUB (HL) - INC HL - LD A,D - SBC A,(HL) ; SET CARRY IF NO MORE NAMES. - RET -; -; CALL THIS ROUTINE TO PREVENT (SCRATCH1) FROM BEING GREATER -; THAN (FILEPOS). -; -CHKNMBR:CALL MOREFLS ; SCRATCH1 TOO BIG? - RET C - INC DE ; YES, RESET IT TO (FILEPOS). - LD (HL),D - DEC HL - LD (HL),E - RET -; -; COMPUTE (HL)=(DE)-(HL) -; -SUBHL: LD A,E ; COMPUTE DIFFERENCE. - SUB L - LD L,A ; STORE LOW BYTE. - LD A,D - SBC A,H - LD H,A ; AND THEN HIGH BYTE. - RET -; -; SET THE DIRECTORY CHECKSUM BYTE. -; -SETDIR: LD C,#0xFF -; -; ROUTINE TO SET OR COMPARE THE DIRECTORY CHECKSUM BYTE. IF -; (C)=0FFH, THEN THIS WILL SET THE CHECKSUM BYTE. ELSE THE BYTE -; WILL BE CHECKED. IF THE CHECK FAILS (THE DISK HAS BEEN CHANGED), -; THEN THIS DISK WILL BE WRITE PROTECTED. -; -CHECKDIR: - LD HL,(CKSUMTBL) - EX DE,HL - LD HL,(ALLOC1) - CALL SUBHL - RET NC ; OK IF (CKSUMTBL) > (ALLOC1), SO RETURN. - PUSH BC - CALL CHECKSUM ; ELSE COMPUTE CHECKSUM. - LD HL,(CHKVECT) ; GET ADDRESS OF CHECKSUM TABLE. - EX DE,HL - LD HL,(CKSUMTBL) - ADD HL,DE ; SET (HL) TO POINT TO BYTE FOR THIS DRIVE. - POP BC - INC C ; SET OR CHECK ? - JP Z,CHKDIR1 - CP (HL) ; CHECK THEM. - RET Z ; RETURN IF THEY ARE THE SAME. - CALL MOREFLS ; NOT THE SAME, DO WE CARE? - RET NC - CALL WRTPRTD ; YES, MARK THIS AS WRITE PROTECTED. - RET -CHKDIR1:LD (HL),A ; JUST SET THE BYTE. - RET -; -; DO A WRITE TO THE DIRECTORY OF THE CURRENT DISK. -; -DIRWRITE: - CALL SETDIR ; SET CHECKSUM BYTE. - CALL DIRDMA ; SET DIRECTORY DMA ADDRESS. - LD C,#1 ; TELL THE BIOS TO ACTUALLY WRITE. - CALL DOWRITE ; THEN DO THE WRITE. - JP DEFDMA -; -; READ FROM THE DIRECTORY. -; -DIRREAD:CALL DIRDMA ; SET THE DIRECTORY DMA ADDRESS. - CALL DOREAD ; AND READ IT. -; -; ROUTINE TO SET THE DMA ADDRESS TO THE USERS CHOICE. -; -DEFDMA: LD HL,#USERDMA ; RESET THE DEFAULT DMA ADDRESS AND RETURN. - JP DIRDMA1 -; -; ROUTINE TO SET THE DMA ADDRESS FOR DIRECTORY WORK. -; -DIRDMA: LD HL,#DIRBUF -; -; SET THE DMA ADDRESS. ON ENTRY, (HL) POINTS TO -; WORD CONTAINING THE DESIRED DMA ADDRESS. -; -DIRDMA1:LD C,(HL) - INC HL - LD B,(HL) ; SETUP (BC) AND GO TO THE BIOS TO SET IT. - JP SETDMA -; -; MOVE THE DIRECTORY BUFFER INTO USER'S DMA SPACE. -; -MOVEDIR:LD HL,(DIRBUF) ; BUFFER IS LOCATED HERE, AND - EX DE,HL - LD HL,(USERDMA) ; PUT IT HERE. - LD C,#128 ; THIS IS ITS LENGTH. - JP DE2HL ; MOVE IT NOW AND RETURN. -; -; CHECK (FILEPOS) AND SET THE ZERO FLAG IF IT .EQUALS 0FFFFH. -; -CKFILPOS: - LD HL,#FILEPOS - LD A,(HL) - INC HL - CP (HL) ; ARE BOTH BYTES THE SAME? - RET NZ - INC A ; YES, BUT ARE THEY EACH 0FFH? - RET -; -; SET LOCATION (FILEPOS) TO 0FFFFH. -; -STFILPOS: - LD HL,#0x0FFFF - LD (FILEPOS),HL - RET -; -; MOVE ON TO THE NEXT FILE POSITION WITHIN THE CURRENT -; DIRECTORY BUFFER. IF NO MORE EXIST, SET POINTER TO 0FFFFH -; AND THE CALLING ROUTINE WILL CHECK FOR THIS. ENTER WITH (C) -; .EQUAL TO 0FFH TO CAUSE THE CHECKSUM BYTE TO BE SET, ELSE WE -; WILL CHECK THIS DISK AND SET WRITE PROTECT IF CHECKSUMS ARE -; NOT THE SAME (APPLIES ONLY IF ANOTHER DIRECTORY SECTOR MUST -; BE READ). -; -NXENTRY:LD HL,(DIRSIZE) ; GET DIRECTORY ENTRY SIZE LIMIT. - EX DE,HL - LD HL,(FILEPOS) ; GET CURRENT COUNT. - INC HL ; GO ON TO THE NEXT ONE. - LD (FILEPOS),HL - CALL SUBHL ; (HL)=(DIRSIZE)-(FILEPOS) - JP NC,NXENT1 ; IS THERE MORE ROOM LEFT? - JP STFILPOS ; NO. SET THIS FLAG AND RETURN. -NXENT1: LD A,(FILEPOS) ; GET FILE POSITION WITHIN DIRECTORY. - AND #3 ; ONLY LOOK WITHIN THIS SECTOR (ONLY 4 ENTRIES FIT). - LD B,#5 ; CONVERT TO RELATIVE POSITION (32 BYTES EACH). -NXENT2: ADD A,A ; NOTE THAT THIS IS NOT EFFICIENT CODE. - DEC B ; 5 'ADD A'S WOULD BE BETTER. - JP NZ,NXENT2 - LD (FCBPOS),A ; SAVE IT AS POSITION OF FCB. - OR A - RET NZ ; RETURN IF WE ARE WITHIN BUFFER. - PUSH BC - CALL TRKSEC ; WE NEED THE NEXT DIRECTORY SECTOR. - CALL DIRREAD - POP BC - JP CHECKDIR -; -; ROUTINE TO TO GET A BIT FROM THE DISK SPACE ALLOCATION -; MAP. IT IS RETURNED IN (A), BIT POSITION 0. ON ENTRY TO HERE, -; SET (BC) TO THE BLOCK NUMBER ON THE DISK TO CHECK. -; ON RETURN, (D) WILL CONTAIN THE ORIGINAL BIT POSITION FOR -; THIS BLOCK NUMBER AND (HL) WILL POINT TO THE ADDRESS FOR IT. -; -CKBITMAP: - LD A,C ; DETERMINE BIT NUMBER OF INTEREST. - AND #7 ; COMPUTE (D)=(E)=(C AND 7)+1. - INC A - LD E,A ; SAVE PARTICULAR BIT NUMBER. - LD D,A -; -; COMPUTE (BC)=(BC)/8. -; - LD A,C - RRCA ; NOW SHIFT RIGHT 3 BITS. - RRCA - RRCA - AND #0x1F ; AND CLEAR BITS 7,6,5. - LD C,A - LD A,B - ADD A,A ; NOW SHIFT (B) INTO BITS 7,6,5. - ADD A,A - ADD A,A - ADD A,A - ADD A,A - OR C ; AND ADD IN (C). - LD C,A ; OK, (C) HA BEEN COMPLETED. - LD A,B ; IS THERE A BETTER WAY OF DOING THIS? - RRCA - RRCA - RRCA - AND #0x1F - LD B,A ; AND NOW (B) IS COMPLETED. -; -; USE THIS AS AN OFFSET INTO THE DISK SPACE ALLOCATION -; TABLE. -; - LD HL,(ALOCVECT) - ADD HL,BC - LD A,(HL) ; NOW GET CORRECT BYTE. -CKBMAP1:RLCA ; GET CORRECT BIT INTO POSITION 0. - DEC E - JP NZ,CKBMAP1 - RET -; -; SET OR CLEAR THE BIT MAP SUCH THAT BLOCK NUMBER (BC) WILL BE MARKED -; AS USED. ON ENTRY, IF (E)=0 THEN THIS BIT WILL BE CLEARED, IF IT .EQUALS -; 1 THEN IT WILL BE SET (DON'T USE ANYOTHER VALUES). -; -STBITMAP: - PUSH DE - CALL CKBITMAP ; GET THE BYTE OF INTEREST. - AND #0x0FE ; CLEAR THE AFFECTED BIT. - POP BC - OR C ; AND NOW SET IT ACORDING TO (C). -; -; ENTRY TO RESTORE THE ORIGINAL BIT POSITION AND THEN STORE -; IN TABLE. (A) CONTAINS THE VALUE, (D) CONTAINS THE BIT -; POSITION (1-8), AND (HL) POINTS TO THE ADDRESS WITHIN THE -; SPACE ALLOCATION TABLE FOR THIS BYTE. -; -STBMAP1:RRCA ; RESTORE ORIGINAL BIT POSITION. - DEC D - JP NZ,STBMAP1 - LD (HL),A ; AND STOR BYTE IN TABLE. - RET -; -; SET/CLEAR SPACE USED BITS IN ALLOCATION MAP FOR THIS FILE. -; ON ENTRY, (C)=1 TO SET THE MAP AND (C)=0 TO CLEAR IT. -; -SETFILE:CALL FCB2HL ; GET ADDRESS OF FCB - LD DE,#16 - ADD HL,DE ; GET TO BLOCK NUMBER BYTES. - PUSH BC - LD C,#17 ; CHECK ALL 17 BYTES (MAX) OF TABLE. -SETFL1: POP DE - DEC C ; DONE ALL BYTES YET? - RET Z - PUSH DE - LD A,(BIGDISK) ; CHECK DISK SIZE FOR 16 BIT BLOCK NUMBERS. - OR A - JP Z,SETFL2 - PUSH BC ; ONLY 8 BIT NUMBERS. SET (BC) TO THIS ONE. - PUSH HL - LD C,(HL) ; GET LOW BYTE FROM TABLE, ALWAYS - LD B,#0 ; SET HIGH BYTE TO ZERO. - JP SETFL3 -SETFL2: DEC C ; FOR 16 BIT BLOCK NUMBERS, ADJUST COUNTER. - PUSH BC - LD C,(HL) ; NOW GET BOTH THE LOW AND HIGH BYTES. - INC HL - LD B,(HL) - PUSH HL -SETFL3: LD A,C ; BLOCK USED? - OR B - JP Z,SETFL4 - LD HL,(DSKSIZE) ; IS THIS BLOCK NUMBER WITHIN THE - LD A,L ; SPACE ON THE DISK? - SUB C - LD A,H - SBC A,B - CALL NC,STBITMAP ; YES, SET THE PROPER BIT. -SETFL4: POP HL ; POINT TO NEXT BLOCK NUMBER IN FCB. - INC HL - POP BC - JP SETFL1 -; -; CONSTRUCT THE SPACE USED ALLOCATION BIT MAP FOR THE ACTIVE -; DRIVE. IF A FILE NAME STARTS WITH '$' AND IT IS UNDER THE -; CURRENT USER NUMBER, THEN (STATUS) IS SET TO MINUS 1. OTHERWISE -; IT IS NOT SET AT ALL. -; -BITMAP: LD HL,(DSKSIZE) ; COMPUTE SIZE OF ALLOCATION TABLE. - LD C,#3 - CALL SHIFTR ; (HL)=(HL)/8. - INC HL ; AT LEASE 1 BYTE. - LD B,H - LD C,L ; SET (BC) TO THE ALLOCATION TABLE LENGTH. -; -; INITIALIZE THE BITMAP FOR THIS DRIVE. RIGHT NOW, THE FIRST -; TWO BYTES ARE SPECIFIED BY THE DISK PARAMETER BLOCK. HOWEVER -; A PATCH COULD BE ENTERED HERE IF IT WERE NECESSARY TO SETUP -; THIS TABLE IN A SPECIAL MANNOR. FOR EXAMPLE, THE BIOS COULD -; DETERMINE LOCATIONS OF 'BAD BLOCKS' AND SET THEM AS ALREADY -; 'USED' IN THE MAP. -; - LD HL,(ALOCVECT) ; NOW ZERO OUT THE TABLE NOW. -BITMAP1:LD (HL),#0 - INC HL - DEC BC - LD A,B - OR C - JP NZ,BITMAP1 - LD HL,(ALLOC0) ; GET INITIAL SPACE USED BY DIRECTORY. - EX DE,HL - LD HL,(ALOCVECT) ; AND PUT THIS INTO MAP. - LD (HL),E - INC HL - LD (HL),D -; -; END OF INITIALIZATION PORTION. -; - CALL HOMEDRV ; NOW HOME THE DRIVE. - LD HL,(SCRATCH1) - LD (HL),#3 ; FORCE NEXT DIRECTORY R.EQUEST TO READ - INC HL ; IN A SECTOR. - LD (HL),#0 - CALL STFILPOS ; CLEAR INITIAL FILE POSITION ALSO. -BITMAP2:LD C,#0x0FF ; READ NEXT FILE NAME IN DIRECTORY - CALL NXENTRY ; AND SET CHECKSUM BYTE. - CALL CKFILPOS ; IS THERE ANOTHER FILE? - RET Z - CALL FCB2HL ; YES, GET ITS ADDRESS. - LD A,#0x0E5 - CP (HL) ; EMPTY FILE ENTRY? - JP Z,BITMAP2 - LD A,(USERNO) ; NO, CORRECT USER NUMBER? - CP (HL) - JP NZ,BITMAP3 - INC HL - LD A,(HL) ; YES, DOES NAME START WITH A '$'? - SUB #DOLLAR - JP NZ,BITMAP3 - DEC A ; YES, SET ATATUS TO MINUS ONE. - LD (STATUS),A -BITMAP3:LD C,#1 ; NOW SET THIS FILE'S SPACE AS USED IN BIT MAP. - CALL SETFILE - CALL CHKNMBR ; KEEP (SCRATCH1) IN BOUNDS. - JP BITMAP2 -; -; SET THE STATUS (STATUS) AND RETURN. -; -STSTATUS: - LD A,(FNDSTAT) - JP SETSTAT -; -; CHECK EXTENTS IN (A) AND (C). SET THE ZERO FLAG IF THEY -; ARE THE SAME. THE NUMBER OF 16K CHUNKS OF DISK SPACE THAT -; THE DIRECTORY EXTENT COVERS IS EXPRESSAD IS (EXTMASK+1). -; NO REGISTERS ARE MODIFIED. -; -SAMEXT: PUSH BC - PUSH AF - LD A,(EXTMASK) ; GET EXTENT MASK AND USE IT TO - CPL ; TO COMPARE BOTH EXTENT NUMBERS. - LD B,A ; SAVE RESULTING MASK HERE. - LD A,C ; MASK FIRST EXTENT AND SAVE IN (C). - AND B - LD C,A - POP AF ; NOW MASK SECOND EXTENT AND COMPARE - AND B ; WITH THE FIRST ONE. - SUB C - AND #0x1F ; (* ONLY CHECK BUTS 0-4 *) - POP BC ; THE ZERO FLAG IS SET IF THEY ARE THE SAME. - RET ; RESTORE (BC) AND RETURN. -; -; SEARCH FOR THE FIRST OCCURENCE OF A FILE NAME. ON ENTRY, -; REGISTER (C) SHOULD CONTAIN THE NUMBER OF BYTES OF THE FCB -; THAT MUST MATCH. -; -FINDFST:LD A,#0x0FF - LD (FNDSTAT),A - LD HL,#COUNTER ; SAVE CHARACTER COUNT. - LD (HL),C - LD HL,(PARAMS) ; GET FILENAME TO MATCH. - LD (SAVEFCB),HL ; AND SAVE. - CALL STFILPOS ; CLEAR INITIAL FILE POSITION (SET TO 0FFFFH). - CALL HOMEDRV ; HOME THE DRIVE. -; -; ENTRY TO LOCATE THE NEXT OCCURENCE OF A FILENAME WITHIN THE -; DIRECTORY. THE DISK IS NOT EXPECTED TO HAVE BEEN CHANGED. IF -; IT WAS, THEN IT WILL BE WRITE PROTECTED. -; -FINDNXT:LD C,#0 ; WRITE PROTECT THE DISK IF CHANGED. - CALL NXENTRY ; GET NEXT FILENAME ENTRY IN DIRECTORY. - CALL CKFILPOS ; IS FILE POSITION = 0FFFFH? - JP Z,FNDNXT6 ; YES, EXIT NOW THEN. - LD HL,(SAVEFCB) ; SET (DE) POINTING TO FILENAME TO MATCH. - EX DE,HL - LD A,(DE) - CP #0x0E5 ; EMPTY DIRECTORY ENTRY? - JP Z,FNDNXT1 ; (* ARE WE TRYING TO RESERECT ERASED ENTRIES? *) - PUSH DE - CALL MOREFLS ; MORE FILES IN DIRECTORY? - POP DE - JP NC,FNDNXT6 ; NO MORE. EXIT NOW. -FNDNXT1:CALL FCB2HL ; GET ADDRESS OF THIS FCB IN DIRECTORY. - LD A,(COUNTER) ; GET NUMBER OF BYTES (CHARACTERS) TO CHECK. - LD C,A - LD B,#0 ; INITIALIZE BYTE POSITION COUNTER. -FNDNXT2:LD A,C ; ARE WE DONE WITH THE COMPARE? - OR A - JP Z,FNDNXT5 - LD A,(DE) ; NO, CHECK NEXT BYTE. - CP #QUESTION ; DON'T CARE ABOUT THIS CHARACTER? - JP Z,FNDNXT4 - LD A,B ; GET BYTES POSITION IN FCB. - CP #13 ; DON'T CARE ABOUT THE THIRTEENTH BYTE EITHER. - JP Z,FNDNXT4 - CP #12 ; EXTENT BYTE? - LD A,(DE) - JP Z,FNDNXT3 - SUB (HL) ; OTHERWISE COMPARE CHARACTERS. - AND #0x7F - JP NZ,FINDNXT ; NOT THE SAME, CHECK NEXT ENTRY. - JP FNDNXT4 ; SO FAR SO GOOD, KEEP CHECKING. -FNDNXT3:PUSH BC ; CHECK THE EXTENT BYTE HERE. - LD C,(HL) - CALL SAMEXT - POP BC - JP NZ,FINDNXT ; NOT THE SAME, LOOK SOME MORE. -; -; SO FAR THE NAMES COMPARE. BUMP POINTERS TO THE NEXT BYTE -; AND CONTINUE UNTIL ALL (C) CHARACTERS HAVE BEEN CHECKED. -; -FNDNXT4:INC DE ; BUMP POINTERS. - INC HL - INC B - DEC C ; ADJUST CHARACTER COUNTER. - JP FNDNXT2 -FNDNXT5:LD A,(FILEPOS) ; RETURN THE POSITION OF THIS ENTRY. - AND #3 - LD (STATUS),A - LD HL,#FNDSTAT - LD A,(HL) - RLA - RET NC - XOR A - LD (HL),A - RET -; -; FILENAME WAS NOT FOUND. SET APPROPRIATE STATUS. -; -FNDNXT6:CALL STFILPOS ; SET (FILEPOS) TO 0FFFFH. - LD A,#0x0FF ; SAY NOT LOCATED. - JP SETSTAT -; -; ERASE FILES FROM THE DIRECTORY. ONLY THE FIRST BYTE OF THE -; FCB WILL BE AFFECTED. IT IS SET TO (E5). -; -ERAFILE:CALL CHKWPRT ; IS DISK WRITE PROTECTED? - LD C,#12 ; ONLY COMPARE FILE NAMES. - CALL FINDFST ; GET FIRST FILE NAME. -ERAFIL1:CALL CKFILPOS ; ANY FOUND? - RET Z ; NOPE, WE MUST BE DONE. - CALL CHKROFL ; IS FILE READ ONLY? - CALL FCB2HL ; NOPE, GET ADDRESS OF FCB AND - LD (HL),#0x0E5 ; SET FIRST BYTE TO 'EMPTY'. - LD C,#0 ; CLEAR THE SPACE FROM THE BIT MAP. - CALL SETFILE - CALL DIRWRITE ; NOW WRITE THE DIRECTORY SECTOR BACK OUT. - CALL FINDNXT ; FIND THE NEXT FILE NAME. - JP ERAFIL1 ; AND REPEAT PROCESS. -; -; LOOK THROUGH THE SPACE ALLOCATION MAP (BIT MAP) FOR THE -; NEXT AVAILABLE BLOCK. START SEARCHING AT BLOCK NUMBER (BC-1). -; THE SEARCH PROCEDURE IS TO LOOK FOR AN EMPTY BLOCK THAT IS -; BEFORE THE STARTING BLOCK. IF NOT EMPTY, LOOK AT A LATER -; BLOCK NUMBER. IN THIS WAY, WE RETURN THE CLOSEST EMPTY BLOCK -; ON EITHER SIDE OF THE 'TARGET' BLOCK NUMBER. THIS WILL SPEED -; ACCESS ON RANDOM DEVICES. FOR SERIAL DEVICES, THIS SHOULD BE -; CHANGED TO LOOK IN THE FORWARD DIRECTION FIRST AND THEN START -; AT THE FRONT AND SEARCH SOME MORE. -; -; ON RETURN, (DE)= BLOCK NUMBER THAT IS EMPTY AND (HL) =0 -; IF NO EMPRY BLOCK WAS FOUND. -; -FNDSPACE: - LD D,B ; SET (DE) AS THE BLOCK THAT IS CHECKED. - LD E,C -; -; LOOK BEFORE TARGET BLOCK. REGISTERS (BC) ARE USED AS THE LOWER -; POINTER AND (DE) AS THE UPPER POINTER. -; -FNDSPA1:LD A,C ; IS BLOCK 0 SPECIFIED? - OR B - JP Z,FNDSPA2 - DEC BC ; NOPE, CHECK PREVIOUS BLOCK. - PUSH DE - PUSH BC - CALL CKBITMAP - RRA ; IS THIS BLOCK EMPTY? - JP NC,FNDSPA3 ; YES. USE THIS. -; -; NOTE THAT THE ABOVE LOGIC GETS THE FIRST BLOCK THAT IT FINDS -; THAT IS EMPTY. THUS A FILE COULD BE WRITTEN 'BACKWARD' MAKING -; IT VERY SLOW TO ACCESS. THIS COULD BE CHANGED TO LOOK FOR THE -; FIRST EMPTY BLOCK AND THEN CONTINUE UNTIL THE START OF THIS -; EMPTY SPACE IS LOCATED AND THEN USED THAT STARTING BLOCK. -; THIS SHOULD HELP SPEED UP ACCESS TO SOME FILES ESPECIALLY ON -; A WELL USED DISK WITH LOTS OF FAIRLY SMALL 'HOLES'. -; - POP BC ; NOPE, CHECK SOME MORE. - POP DE -; -; NOW LOOK AFTER TARGET BLOCK. -; -FNDSPA2:LD HL,(DSKSIZE) ; IS BLOCK (DE) WITHIN DISK LIMITS? - LD A,E - SUB L - LD A,D - SBC A,H - JP NC,FNDSPA4 - INC DE ; YES, MOVE ON TO NEXT ONE. - PUSH BC - PUSH DE - LD B,D - LD C,E - CALL CKBITMAP ; CHECK IT. - RRA ; EMPTY? - JP NC,FNDSPA3 - POP DE ; NOPE, CONTINUE SEARCHING. - POP BC - JP FNDSPA1 -; -; EMPTY BLOCK FOUND. SET IT AS USED AND RETURN WITH (HL) -; POINTING TO IT (TRUE?). -; -FNDSPA3:RLA ; RESET BYTE. - INC A ; AND SET BIT 0. - CALL STBMAP1 ; UPDATE BIT MAP. - POP HL ; SET RETURN REGISTERS. - POP DE - RET -; -; FREE BLOCK WAS NOT FOUND. IF (BC) IS NOT ZERO, THEN WE HAVE -; NOT CHECKED ALL OF THE DISK SPACE. -; -FNDSPA4:LD A,C - OR B - JP NZ,FNDSPA1 - LD HL,#0 ; SET 'NOT FOUND' STATUS. - RET -; -; MOVE A COMPLETE FCB ENTRY INTO THE DIRECTORY AND WRITE IT. -; -FCBSET: LD C,#0 - LD E,#32 ; LENGTH OF EACH ENTRY. -; -; MOVE (E) BYTES FROM THE FCB POINTED TO BY (PARAMS) INTO -; FCB IN DIRECTORY STARTING AT RELATIVE BYTE (C). THIS UPDATED -; DIRECTORY BUFFER IS THEN WRITTEN TO THE DISK. -; -UPDATE: PUSH DE - LD B,#0 ; SET (BC) TO RELATIVE BYTE POSITION. - LD HL,(PARAMS) ; GET ADDRESS OF FCB. - ADD HL,BC ; COMPUTE STARTING BYTE. - EX DE,HL - CALL FCB2HL ; GET ADDRESS OF FCB TO UPDATE IN DIRECTORY. - POP BC ; SET (C) TO NUMBER OF BYTES TO CHANGE. - CALL DE2HL -UPDATE1:CALL TRKSEC ; DETERMINE THE TRACK AND SECTOR AFFECTED. - JP DIRWRITE ; THEN WRITE THIS SECTOR OUT. -; -; ROUTINE TO CHANGE THE NAME OF ALL FILES ON THE DISK WITH A -; SPECIFIED NAME. THE FCB CONTAINS THE CURRENT NAME AS THE -; FIRST 12 CHARACTERS AND THE NEW NAME 16 BYTES INTO THE FCB. -; -CHGNAMES: - CALL CHKWPRT ; CHECK FOR A WRITE PROTECTED DISK. - LD C,#12 ; MATCH FIRST 12 BYTES OF FCB ONLY. - CALL FINDFST ; GET FIRST NAME. - LD HL,(PARAMS) ; GET ADDRESS OF FCB. - LD A,(HL) ; GET USER NUMBER. - LD DE,#16 ; MOVE OVER TO DESIRED NAME. - ADD HL,DE - LD (HL),A ; KEEP SAME USER NUMBER. -CHGNAM1:CALL CKFILPOS ; ANY MATCHING FILE FOUND? - RET Z ; NO, WE MUST BE DONE. - CALL CHKROFL ; CHECK FOR READ ONLY FILE. - LD C,#16 ; START 16 BYTES INTO FCB. - LD E,#12 ; AND UPDATE THE FIRST 12 BYTES OF DIRECTORY. - CALL UPDATE - CALL FINDNXT ; GET TE NEXT FILE NAME. - JP CHGNAM1 ; AND CONTINUE. -; -; UPDATE A FILES ATTRIBUTES. THE PROCEDURE IS TO SEARCH FOR -; EVERY FILE WITH THE SAME NAME AS SHOWN IN FCB (IGNORING BIT 7) -; AND THEN TO UPDATE IT (WHICH INCLUDES BIT 7). NO OTHER CHANGES -; ARE MADE. -; -SAVEATTR: - LD C,#12 ; MATCH FIRST 12 BYTES. - CALL FINDFST ; LOOK FOR FIRST FILENAME. -SAVATR1:CALL CKFILPOS ; WAS ONE FOUND? - RET Z ; NOPE, WE MUST BE DONE. - LD C,#0 ; YES, UPDATE THE FIRST 12 BYTES NOW. - LD E,#12 - CALL UPDATE ; UPDATE FILENAME AND WRITE DIRECTORY. - CALL FINDNXT ; AND GET THE NEXT FILE. - JP SAVATR1 ; THEN CONTINUE UNTIL DONE. -; -; OPEN A FILE (NAME SPECIFIED IN FCB). -; -OPENIT: LD C,#15 ; COMPARE THE FIRST 15 BYTES. - CALL FINDFST ; GET THE FIRST ONE IN DIRECTORY. - CALL CKFILPOS ; ANY AT ALL? - RET Z -OPENIT1:CALL SETEXT ; POINT TO EXTENT BYTE WITHIN USERS FCB. - LD A,(HL) ; AND GET IT. - PUSH AF ; SAVE IT AND ADDRESS. - PUSH HL - CALL FCB2HL ; POINT TO FCB IN DIRECTORY. - EX DE,HL - LD HL,(PARAMS) ; THIS IS THE USERS COPY. - LD C,#32 ; MOVE IT INTO USERS SPACE. - PUSH DE - CALL DE2HL - CALL SETS2B7 ; SET BIT 7 IN 'S2' BYTE (UNMODIFIED). - POP DE ; NOW GET THE EXTENT BYTE FROM THIS FCB. - LD HL,#12 - ADD HL,DE - LD C,(HL) ; INTO (C). - LD HL,#15 ; NOW GET THE RECORD COUNT BYTE INTO (B). - ADD HL,DE - LD B,(HL) - POP HL ; KEEP THE SAME EXTENT AS THE USER HAD ORIGINALLY. - POP AF - LD (HL),A - LD A,C ; IS IT THE SAME AS IN THE DIRECTORY FCB? - CP (HL) - LD A,B ; IF YES, THEN USE THE SAME RECORD COUNT. - JP Z,OPENIT2 - LD A,#0 ; IF THE USER SPECIFIED AN EXTENT GREATER THAN - JP C,OPENIT2 ; THE ONE IN THE DIRECTORY, THEN SET RECORD COUNT TO 0. - LD A,#128 ; OTHERWISE SET TO MAXIMUM. -OPENIT2:LD HL,(PARAMS) ; SET RECORD COUNT IN USERS FCB TO (A). - LD DE,#15 - ADD HL,DE ; COMPUTE RELATIVE POSITION. - LD (HL),A ; AND SET THE RECORD COUNT. - RET -; -; MOVE TWO BYTES FROM (DE) TO (HL) IF (AND ONLY IF) (HL) -; POINT TO A ZERO VALUE (16 BIT). -; RETURN WITH ZERO FLAG SET IT (DE) WAS MOVED. REGISTERS (DE) -; AND (HL) ARE NOT CHANGED. HOWEVER (A) IS. -; -MOVEWORD: - LD A,(HL) ; CHECK FOR A ZERO WORD. - INC HL - OR (HL) ; BOTH BYTES ZERO? - DEC HL - RET NZ ; NOPE, JUST RETURN. - LD A,(DE) ; YES, MOVE TWO BYTES FROM (DE) INTO - LD (HL),A ; THIS ZERO SPACE. - INC DE - INC HL - LD A,(DE) - LD (HL),A - DEC DE ; DON'T DISTURB THESE REGISTERS. - DEC HL - RET -; -; GET HERE TO CLOSE A FILE SPECIFIED BY (FCB). -; -CLOSEIT:XOR A ; CLEAR STATUS AND FILE POSITION BYTES. - LD (STATUS),A - LD (FILEPOS),A - LD (FILEPOS+1),A - CALL GETWPRT ; GET WRITE PROTECT BIT FOR THIS DRIVE. - RET NZ ; JUST RETURN IF IT IS SET. - CALL GETS2 ; ELSE GET THE 'S2' BYTE. - AND #0x80 ; AND LOOK AT BIT 7 (FILE UNMODIFIED?). - RET NZ ; JUST RETURN IF SET. - LD C,#15 ; ELSE LOOK UP THIS FILE IN DIRECTORY. - CALL FINDFST - CALL CKFILPOS ; WAS IT FOUND? - RET Z ; JUST RETURN IF NOT. - LD BC,#16 ; SET (HL) POINTING TO RECORDS USED SECTION. - CALL FCB2HL - ADD HL,BC - EX DE,HL - LD HL,(PARAMS) ; DO THE SAME FOR USERS SPECIFIED FCB. - ADD HL,BC - LD C,#16 ; THIS MANY BYTES ARE PRESENT IN THIS EXTENT. -CLOSEIT1: - LD A,(BIGDISK) ; 8 OR 16 BIT RECORD NUMBERS? - OR A - JP Z,CLOSEIT4 - LD A,(HL) ; JUST 8 BIT. GET ONE FROM USERS FCB. - OR A - LD A,(DE) ; NOW GET ONE FROM DIRECTORY FCB. - JP NZ,CLOSEIT2 - LD (HL),A ; USERS BYTE WAS ZERO. UPDATE FROM DIRECTORY. -CLOSEIT2: - OR A - JP NZ,CLOSEIT3 - LD A,(HL) ; DIRECTORIES BYTE WAS ZERO, UPDATE FROM USERS FCB. - LD (DE),A -CLOSEIT3: - CP (HL) ; IF NEITHER ONE OF THESE BYTES WERE ZERO, - JP NZ,CLOSEIT7 ; THEN CLOSE ERROR IF THEY ARE NOT THE SAME. - JP CLOSEIT5 ; OK SO FAR, GET TO NEXT BYTE IN FCBS. -CLOSEIT4: - CALL MOVEWORD ; UPDATE USERS FCB IF IT IS ZERO. - EX DE,HL - CALL MOVEWORD ; UPDATE DIRECTORIES FCB IF IT IS ZERO. - EX DE,HL - LD A,(DE) ; IF THESE TWO VALUES ARE NO DIFFERENT, - CP (HL) ; THEN A CLOSE ERROR OCCURED. - JP NZ,CLOSEIT7 - INC DE ; CHECK SECOND BYTE. - INC HL - LD A,(DE) - CP (HL) - JP NZ,CLOSEIT7 - DEC C ; REMEMBER 16 BIT VALUES. -CLOSEIT5: - INC DE ; BUMP TO NEXT ITEM IN TABLE. - INC HL - DEC C ; THERE ARE 16 ENTRIES ONLY. - JP NZ,CLOSEIT1 ; CONTINUE IF MORE TO DO. - LD BC,#0x0FFEC ; BACKUP 20 PLACES (EXTENT BYTE). - ADD HL,BC - EX DE,HL - ADD HL,BC - LD A,(DE) - CP (HL) ; DIRECTORY'S EXTENT ALREADY GREATER THAN THE - JP C,CLOSEIT6 ; USERS EXTENT? - LD (HL),A ; NO, UPDATE DIRECTORY EXTENT. - LD BC,#3 ; AND UPDATE THE RECORD COUNT BYTE IN - ADD HL,BC ; DIRECTORIES FCB. - EX DE,HL - ADD HL,BC - LD A,(HL) ; GET FROM USER. - LD (DE),A ; AND PUT IN DIRECTORY. -CLOSEIT6: - LD A,#0x0FF ; SET 'WAS OPEN AND IS NOW CLOSED' BYTE. - LD (CLOSEFLG),A - JP UPDATE1 ; UPDATE THE DIRECTORY NOW. -CLOSEIT7: - LD HL,#STATUS ; SET RETURN STATUS AND THEN RETURN. - DEC (HL) - RET -; -; ROUTINE TO GET THE NEXT EMPTY SPACE IN THE DIRECTORY. IT -; WILL THEN BE CLEARED FOR USE. -; -GETEMPTY: - CALL CHKWPRT ; MAKE SURE DISK IS NOT WRITE PROTECTED. - LD HL,(PARAMS) ; SAVE CURRENT PARAMETERS (FCB). - PUSH HL - LD HL,#EMPTYFCB ; USE SPECIAL ONE FOR EMPTY SPACE. - LD (PARAMS),HL - LD C,#1 ; SEARCH FOR FIRST EMPTY SPOT IN DIRECTORY. - CALL FINDFST ; (* ONLY CHECK FIRST BYTE *) - CALL CKFILPOS ; NONE? - POP HL - LD (PARAMS),HL ; RESTORE ORIGINAL FCB ADDRESS. - RET Z ; RETURN IF NO MORE SPACE. - EX DE,HL - LD HL,#15 ; POINT TO NUMBER OF RECORDS FOR THIS FILE. - ADD HL,DE - LD C,#17 ; AND CLEAR ALL OF THIS SPACE. - XOR A -GETMT1: LD (HL),A - INC HL - DEC C - JP NZ,GETMT1 - LD HL,#13 ; CLEAR THE 'S1' BYTE ALSO. - ADD HL,DE - LD (HL),A - CALL CHKNMBR ; KEEP (SCRATCH1) WITHIN BOUNDS. - CALL FCBSET ; WRITE OUT THIS FCB ENTRY TO DIRECTORY. - JP SETS2B7 ; SET 'S2' BYTE BIT 7 (UNMODIFIED AT PRESENT). -; -; ROUTINE TO CLOSE THE CURRENT EXTENT AND OPEN THE NEXT ONE -; FOR READING. -; -GETNEXT:XOR A - LD (CLOSEFLG),A ; CLEAR CLOSE FLAG. - CALL CLOSEIT ; CLOSE THIS EXTENT. - CALL CKFILPOS - RET Z ; NOT THERE??? - LD HL,(PARAMS) ; GET EXTENT BYTE. - LD BC,#12 - ADD HL,BC - LD A,(HL) ; AND INCREMENT IT. - INC A - AND #0x1F ; KEEP WITHIN RANGE 0-31. - LD (HL),A - JP Z,GTNEXT1 ; OVERFLOW? - LD B,A ; MASK EXTENT BYTE. - LD A,(EXTMASK) - AND B - LD HL,#CLOSEFLG ; CHECK CLOSE FLAG (0FFH IS OK). - AND (HL) - JP Z,GTNEXT2 ; IF ZERO, WE MUST READ IN NEXT EXTENT. - JP GTNEXT3 ; ELSE, IT IS ALREADY IN MEMORY. -GTNEXT1:LD BC,#2 ; POINT TO THE 'S2' BYTE. - ADD HL,BC - INC (HL) ; AND BUMP IT. - LD A,(HL) ; TOO MANY EXTENTS? - AND #0x0F - JP Z,GTNEXT5 ; YES, SET ERROR CODE. -; -; GET HERE TO OPEN THE NEXT EXTENT. -; -GTNEXT2:LD C,#15 ; SET TO CHECK FIRST 15 BYTES OF FCB. - CALL FINDFST ; FIND THE FIRST ONE. - CALL CKFILPOS ; NONE AVAILABLE? - JP NZ,GTNEXT3 - LD A,(R.DWRTFLG) ; NO EXTENT PRESENT. CAN WE OPEN AN EMPTY ONE? - INC A ; 0FFH MEANS READING (SO NOT POSSIBLE). - JP Z,GTNEXT5 ; OR AN ERROR. - CALL GETEMPTY ; WE ARE WRITING, GET AN EMPTY ENTRY. - CALL CKFILPOS ; NONE? - JP Z,GTNEXT5 ; ERROR IF TRUE. - JP GTNEXT4 ; ELSE WE ARE ALMOST DONE. -GTNEXT3:CALL OPENIT1 ; OPEN THIS EXTENT. -GTNEXT4:CALL STRDATA ; MOVE IN UPDATED DATA (REC #, EXTENT #, ETC.) - XOR A ; CLEAR STATUS AND RETURN. - JP SETSTAT -; -; ERROR IN EXTENDING THE FILE. TOO MANY EXTENTS WERE NEEDED -; OR NOT ENOUGH SPACE ON THE DISK. -; -GTNEXT5:CALL IOERR1 ; SET ERROR CODE, CLEAR BIT 7 OF 'S2' - JP SETS2B7 ; SO THIS IS NOT WRITTEN ON A CLOSE. -; -; READ A S.EQUENTIAL FILE. -; -RDSEQ: LD A,#1 ; SET S.EQUENTIAL ACCESS MODE. - LD (MODE),A -RDSEQ1: LD A,#0x0FF ; DON'T ALLOW READING UNWRITTEN SPACE. - LD (R.DWRTFLG),A - CALL STRDATA ; PUT REC# AND EXT# INTO FCB. - LD A,(SAVNREC) ; GET NEXT RECORD TO READ. - LD HL,#SAVNXT ; GET NUMBER OF RECORDS IN EXTENT. - CP (HL) ; WITHIN THIS EXTENT? - JP C,RDSEQ2 - CP #128 ; NO. IS THIS EXTENT FULLY USED? - JP NZ,RDSEQ3 ; NO. END-OF-FILE. - CALL GETNEXT ; YES, OPEN THE NEXT ONE. - XOR A ; RESET NEXT RECORD TO READ. - LD (SAVNREC),A - LD A,(STATUS) ; CHECK ON OPEN, SUCCESSFUL? - OR A - JP NZ,RDSEQ3 ; NO, ERROR. -RDSEQ2: CALL COMBLK ; OK. COMPUTE BLOCK NUMBER TO READ. - CALL CHKBLK ; CHECK IT. WITHIN BOUNDS? - JP Z,RDSEQ3 ; NO, ERROR. - CALL LOGICAL ; CONVERT (BLKNMBR) TO LOGICAL SECTOR (128 BYTE). - CALL TRKSEC1 ; SET THE TRACK AND SECTOR FOR THIS BLOCK #. - CALL DOREAD ; AND READ IT. - JP SETNREC ; AND SET THE NEXT RECORD TO BE ACCESSED. -; -; READ ERROR OCCURED. SET STATUS AND RETURN. -; -RDSEQ3: JP IOERR1 -; -; WRITE THE NEXT S.EQUENTIAL RECORD. -; -WTSEQ: LD A,#1 ; SET S.EQUENTIAL ACCESS MODE. - LD (MODE),A -WTSEQ1: LD A,#0 ; ALLOW AN ADDITION EMPTY EXTENT TO BE OPENED. - LD (R.DWRTFLG),A - CALL CHKWPRT ; CHECK WRITE PROTECT STATUS. - LD HL,(PARAMS) - CALL CKROF1 ; CHECK FOR READ ONLY FILE, (HL) ALREADY SET TO FCB. - CALL STRDATA ; PUT UPDATED DATA INTO FCB. - LD A,(SAVNREC) ; GET RECORD NUMBER TO WRITE. - CP #128 ; WITHIN RANGE? - JP NC,IOERR1 ; NO, ERROR(?). - CALL COMBLK ; COMPUTE BLOCK NUMBER. - CALL CHKBLK ; CHECK NUMBER. - LD C,#0 ; IS THERE ONE TO WRITE TO? - JP NZ,WTSEQ6 ; YES, GO DO IT. - CALL GETBLOCK ; GET NEXT BLOCK NUMBER WITHIN FCB TO USE. - LD (RELBLOCK),A ; AND SAVE. - LD BC,#0 ; START LOOKING FOR SPACE FROM THE START - OR A ; IF NONE ALLOCATED AS YET. - JP Z,WTSEQ2 - LD C,A ; EXTRACT PREVIOUS BLOCK NUMBER FROM FCB - DEC BC ; SO WE CAN BE CLOSEST TO IT. - CALL EXTBLK - LD B,H - LD C,L -WTSEQ2: CALL FNDSPACE ; FIND THE NEXT EMPTY BLOCK NEAREST NUMBER (BC). - LD A,L ; CHECK FOR A ZERO NUMBER. - OR H - JP NZ,WTSEQ3 - LD A,#2 ; NO MORE SPACE? - JP SETSTAT -WTSEQ3: LD (BLKNMBR),HL ; SAVE BLOCK NUMBER TO ACCESS. - EX DE,HL ; PUT BLOCK NUMBER INTO (DE). - LD HL,(PARAMS) ; NOW WE MUST UPDATE THE FCB FOR THIS - LD BC,#16 ; NEWLY ALLOCATED BLOCK. - ADD HL,BC - LD A,(BIGDISK) ; 8 OR 16 BIT BLOCK NUMBERS? - OR A - LD A,(RELBLOCK) ; (* UPDATE THIS ENTRY *) - JP Z,WTSEQ4 ; ZERO MEANS 16 BIT ONES. - CALL ADDA2HL ; (HL)=(HL)+(A) - LD (HL),E ; STORE NEW BLOCK NUMBER. - JP WTSEQ5 -WTSEQ4: LD C,A ; COMPUTE SPOT IN THIS 16 BIT TABLE. - LD B,#0 - ADD HL,BC - ADD HL,BC - LD (HL),E ; STUFF BLOCK NUMBER (DE) THERE. - INC HL - LD (HL),D -WTSEQ5: LD C,#2 ; SET (C) TO INDICATE WRITING TO UN-USED DISK SPACE. -WTSEQ6: LD A,(STATUS) ; ARE WE OK SO FAR? - OR A - RET NZ - PUSH BC ; YES, SAVE WRITE FLAG FOR BIOS (REGISTER C). - CALL LOGICAL ; CONVERT (BLKNMBR) OVER TO LOICAL SECTORS. - LD A,(MODE) ; GET ACCESS MODE FLAG (1=S.EQUENTIAL, - DEC A ; 0=RANDOM, 2=SPECIAL?). - DEC A - JP NZ,WTSEQ9 -; -; SPECIAL RANDOM I/O FROM FUNCTION #40. MAYBE FOR M/PM, BUT THE -; CURRENT BLOCK, IF IT HAS NOT BEEN WRITTEN TO, WILL BE ZEROED -; OUT AND THEN WRITTEN (REASON?). -; - POP BC - PUSH BC - LD A,C ; GET WRITE STATUS FLAG (2=WRITING UNUSED SPACE). - DEC A - DEC A - JP NZ,WTSEQ9 - PUSH HL - LD HL,(DIRBUF) ; ZERO OUT THE DIRECTORY BUFFER. - LD D,A ; NOTE THAT (A) IS ZERO HERE. -WTSEQ7: LD (HL),A - INC HL - INC D ; DO 128 BYTES. - JP P,WTSEQ7 - CALL DIRDMA ; TELL THE BIOS THE DMA ADDRESS FOR DIRECTORY ACCESS. - LD HL,(LOGSECT) ; GET SECTOR THAT STARTS CURRENT BLOCK. - LD C,#2 ; SET 'WRITING TO UNUSED SPACE' FLAG. -WTSEQ8: LD (BLKNMBR),HL ; SAVE SECTOR TO WRITE. - PUSH BC - CALL TRKSEC1 ; DETERMINE ITS TRACK AND SECTOR NUMBERS. - POP BC - CALL DOWRITE ; NOW WRITE OUT 128 BYTES OF ZEROS. - LD HL,(BLKNMBR) ; GET SECTOR NUMBER. - LD C,#0 ; SET NORMAL WRITE FLAG. - LD A,(BLKMASK) ; DETERMINE IF WE HAVE WRITTEN THE ENTIRE - LD B,A ; PHYSICAL BLOCK. - AND L - CP B - INC HL ; PREPARE FOR THE NEXT ONE. - JP NZ,WTSEQ8 ; CONTINUE UNTIL (BLKMASK+1) SECTORS WRITTEN. - POP HL ; RESET NEXT SECTOR NUMBER. - LD (BLKNMBR),HL - CALL DEFDMA ; AND RESET DMA ADDRESS. -; -; NORMAL DISK WRITE. SET THE DESIRED TRACK AND SECTOR THEN -; DO THE ACTUAL WRITE. -; -WTSEQ9: CALL TRKSEC1 ; DETERMINE TRACK AND SECTOR FOR THIS WRITE. - POP BC ; GET WRITE STATUS FLAG. - PUSH BC - CALL DOWRITE ; AND WRITE THIS OUT. - POP BC - LD A,(SAVNREC) ; GET NUMBER OF RECORDS IN FILE. - LD HL,#SAVNXT ; GET LAST RECORD WRITTEN. - CP (HL) - JP C,WTSEQ10 - LD (HL),A ; WE HAVE TO UPDATE RECORD COUNT. - INC (HL) - LD C,#2 -; -;* THIS AREA HAS BEEN PATCHED TO CORRECT DISK UPDATE PROBLEM -;* WHEN USING BLOCKING AND DE-BLOCKING IN THE BIOS. -; -WTSEQ10:NOP ; WAS 'DCR C' - NOP ; WAS 'DCR C' - LD HL,#0 ; WAS 'JNZ WTSEQ99' -; -; * END OF PATCH. -; - PUSH AF - CALL GETS2 ; SET 'EXTENT WRITTEN TO' FLAG. - AND #0x7F ; (* CLEAR BIT 7 *) - LD (HL),A - POP AF ; GET RECORD COUNT FOR THIS EXTENT. -WTSEQ99:CP #127 ; IS IT FULL? - JP NZ,WTSEQ12 - LD A,(MODE) ; YES, ARE WE IN S.EQUENTIAL MODE? - CP #1 - JP NZ,WTSEQ12 - CALL SETNREC ; YES, SET NEXT RECORD NUMBER. - CALL GETNEXT ; AND GET NEXT EMPTY SPACE IN DIRECTORY. - LD HL,#STATUS ; OK? - LD A,(HL) - OR A - JP NZ,WTSEQ11 - DEC A ; YES, SET RECORD COUNT TO -1. - LD (SAVNREC),A -WTSEQ11:LD (HL),#0 ; CLEAR STATUS. -WTSEQ12:JP SETNREC ; SET NEXT RECORD TO ACCESS. -; -; FOR RANDOM I/O, SET THE FCB FOR THE DESIRED RECORD NUMBER -; BASED ON THE 'R0,R1,R2' BYTES. THESE BYTES IN THE FCB ARE -; USED AS FOLLOWS: -; -; FCB+35 FCB+34 FCB+33 -; | 'R-2' | 'R-1' | 'R-0' | -; |7 0 | 7 0 | 7 0| -; |0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0| -; | OVERFLOW | | EXTRA | EXTENT | RECORD # | -; | ______________| |_EXTENT|__NUMBER___|_____________| -; ALSO 'S2' -; -; ON ENTRY, REGISTER (C) CONTAINS 0FFH IF THIS IS A READ -; AND THUS WE CAN NOT ACCESS UNWRITTEN DISK SPACE. OTHERWISE, -; ANOTHER EXTENT WILL BE OPENED (FOR WRITING) IF R.EQUIRED. -; -POSITION: - XOR A ; SET RANDOM I/O FLAG. - LD (MODE),A -; -; SPECIAL ENTRY (FUNCTION #40). M/PM ? -; -POSITN1:PUSH BC ; SAVE READ/WRITE FLAG. - LD HL,(PARAMS) ; GET ADDRESS OF FCB. - EX DE,HL - LD HL,#33 ; NOW GET BYTE 'R0'. - ADD HL,DE - LD A,(HL) - AND #0x7F ; KEEP BITS 0-6 FOR THE RECORD NUMBER TO ACCESS. - PUSH AF - LD A,(HL) ; NOW GET BIT 7 OF 'R0' AND BITS 0-3 OF 'R1'. - RLA - INC HL - LD A,(HL) - RLA - AND #0x1F ; AND SAVE THIS IN BITS 0-4 OF (C). - LD C,A ; THIS IS THE EXTENT BYTE. - LD A,(HL) ; NOW GET THE EXTRA EXTENT BYTE. - RRA - RRA - RRA - RRA - AND #0x0F - LD B,A ; AND SAVE IT IN (B). - POP AF ; GET RECORD NUMBER BACK TO (A). - INC HL ; CHECK OVERFLOW BYTE 'R2'. - LD L,(HL) - INC L - DEC L - LD L,#6 ; PREPARE FOR ERROR. - JP NZ,POSITN5 ; OUT OF DISK SPACE ERROR. - LD HL,#32 ; STORE RECORD NUMBER INTO FCB. - ADD HL,DE - LD (HL),A - LD HL,#12 ; AND NOW CHECK THE EXTENT BYTE. - ADD HL,DE - LD A,C - SUB (HL) ; SAME EXTENT AS BEFORE? - JP NZ,POSITN2 - LD HL,#14 ; YES, CHECK EXTRA EXTENT BYTE 'S2' ALSO. - ADD HL,DE - LD A,B - SUB (HL) - AND #0x7F - JP Z,POSITN3 ; SAME, WE ARE ALMOST DONE THEN. -; -; GET HERE WHEN ANOTHER EXTENT IS R.EQUIRED. -; -POSITN2:PUSH BC - PUSH DE - CALL CLOSEIT ; CLOSE CURRENT EXTENT. - POP DE - POP BC - LD L,#3 ; PREPARE FOR ERROR. - LD A,(STATUS) - INC A - JP Z,POSITN4 ; CLOSE ERROR. - LD HL,#12 ; PUT DESIRED EXTENT INTO FCB NOW. - ADD HL,DE - LD (HL),C - LD HL,#14 ; AND STORE EXTRA EXTENT BYTE 'S2'. - ADD HL,DE - LD (HL),B - CALL OPENIT ; TRY AND GET THIS EXTENT. - LD A,(STATUS) ; WAS IT THERE? - INC A - JP NZ,POSITN3 - POP BC ; NO. CAN WE CREATE A NEW ONE (WRITING?). - PUSH BC - LD L,#4 ; PREPARE FOR ERROR. - INC C - JP Z,POSITN4 ; NOPE, READING UNWRITTEN SPACE ERROR. - CALL GETEMPTY ; YES WE CAN, TRY TO FIND SPACE. - LD L,#5 ; PREPARE FOR ERROR. - LD A,(STATUS) - INC A - JP Z,POSITN4 ; OUT OF SPACE? -; -; NORMAL RETURN LOCATION. CLEAR ERROR CODE AND RETURN. -; -POSITN3:POP BC ; RESTORE STACK. - XOR A ; AND CLEAR ERROR CODE BYTE. - JP SETSTAT -; -; ERROR. SET THE 'S2' BYTE TO INDICATE THIS (WHY?). -; -POSITN4:PUSH HL - CALL GETS2 - LD (HL),#0x0C0 - POP HL -; -; RETURN WITH ERROR CODE (PRESENTLY IN L). -; -POSITN5:POP BC - LD A,L ; GET ERROR CODE. - LD (STATUS),A - JP SETS2B7 -; -; READ A RANDOM RECORD. -; -READRAN:LD C,#0x0FF ; SET 'READ' STATUS. - CALL POSITION ; POSITION THE FILE TO PROPER RECORD. - CALL Z,RDSEQ1 ; AND READ IT AS USUAL (IF NO ERRORS). - RET -; -; WRITE TO A RANDOM RECORD. -; -WRITERAN: - LD C,#0 ; SET 'WRITING' FLAG. - CALL POSITION ; POSITION THE FILE TO PROPER RECORD. - CALL Z,WTSEQ1 ; AND WRITE AS USUAL (IF NO ERRORS). - RET -; -; COMPUTE THE RANDOM RECORD NUMBER. ENTER WITH (HL) POINTING -; TO A FCB AN (DE) CONTAINS A RELATIVE LOCATION OF A RECORD -; NUMBER. ON EXIT, (C) CONTAINS THE 'R0' BYTE, (B) THE 'R1' -; BYTE, AND (A) THE 'R2' BYTE. -; -; ON RETURN, THE ZERO FLAG IS SET IF THE RECORD IS WITHIN -; BOUNDS. OTHERWISE, AN OVERFLOW OCCURED. -; -COMPRAND: - EX DE,HL ; SAVE FCB POINTER IN (DE). - ADD HL,DE ; COMPUTE RELATIVE POSITION OF RECORD #. - LD C,(HL) ; GET RECORD NUMBER INTO (BC). - LD B,#0 - LD HL,#12 ; NOW GET EXTENT. - ADD HL,DE - LD A,(HL) ; COMPUTE (BC)=(RECORD #)+(EXTENT)*128. - RRCA ; MOVE LOWER BIT INTO BIT 7. - AND #0x80 ; AND IGNORE ALL OTHER BITS. - ADD A,C ; ADD TO OUR RECORD NUMBER. - LD C,A - LD A,#0 ; TAKE CARE OF ANY CARRY. - ADC A,B - LD B,A - LD A,(HL) ; NOW GET THE UPPER BITS OF EXTENT INTO - RRCA ; BIT POSITIONS 0-3. - AND #0x0F ; AND IGNORE ALL OTHERS. - ADD A,B ; ADD THIS IN TO 'R1' BYTE. - LD B,A - LD HL,#14 ; GET THE 'S2' BYTE (EXTRA EXTENT). - ADD HL,DE - LD A,(HL) - ADD A,A ; AND SHIFT IT LEFT 4 BITS (BITS 4-7). - ADD A,A - ADD A,A - ADD A,A - PUSH AF ; SAVE CARRY FLAG (BIT 0 OF FLAG BYTE). - ADD A,B ; NOW ADD EXTRA EXTENT INTO 'R1'. - LD B,A - PUSH AF ; AND SAVE CARRY (OVERFLOW BYTE 'R2'). - POP HL ; BIT 0 OF (L) IS THE OVERFLOW INDICATOR. - LD A,L - POP HL ; AND SAME FOR FIRST CARRY FLAG. - OR L ; EITHER ONE OF THESE SET? - AND #1 ; ONLY CHECK THE CARRY FLAGS. - RET -; -; ROUTINE TO SETUP THE FCB (BYTES 'R0', 'R1', 'R2') TO -; REFLECT THE LAST RECORD USED FOR A RANDOM (OR OTHER) FILE. -; THIS READS THE DIRECTORY AND LOOKS AT ALL EXTENTS COMPUTING -; THE LARGERST RECORD NUMBER FOR EACH AND KEEPING THE MAXIMUM -; VALUE ONLY. THEN 'R0', 'R1', AND 'R2' WILL REFLECT THIS -; MAXIMUM RECORD NUMBER. THIS IS USED TO COMPUTE THE SPACE USED -; BY A RANDOM FILE. -; -RANSIZE:LD C,#12 ; LOOK THRU DIRECTORY FOR FIRST ENTRY WITH - CALL FINDFST ; THIS NAME. - LD HL,(PARAMS) ; ZERO OUT THE 'R0, R1, R2' BYTES. - LD DE,#33 - ADD HL,DE - PUSH HL - LD (HL),D ; NOTE THAT (D)=0. - INC HL - LD (HL),D - INC HL - LD (HL),D -RANSIZ1:CALL CKFILPOS ; IS THERE AN EXTENT TO PROCESS? - JP Z,RANSIZ3 ; NO, WE ARE DONE. - CALL FCB2HL ; SET (HL) POINTING TO PROPER FCB IN DIR. - LD DE,#15 ; POINT TO LAST RECORD IN EXTENT. - CALL COMPRAND ; AND COMPUTE RANDOM PARAMETERS. - POP HL - PUSH HL ; NOW CHECK THESE VALUES AGAINST THOSE - LD E,A ; ALREADY IN FCB. - LD A,C ; THE CARRY FLAG WILL BE SET IF THOSE - SUB (HL) ; IN THE FCB REPRESENT A LARGER SIZE THAN - INC HL ; THIS EXTENT DOES. - LD A,B - SBC A,(HL) - INC HL - LD A,E - SBC A,(HL) - JP C,RANSIZ2 - LD (HL),E ; WE FOUND A LARGER (IN SIZE) EXTENT. - DEC HL ; STUFF THESE VALUES INTO FCB. - LD (HL),B - DEC HL - LD (HL),C -RANSIZ2:CALL FINDNXT ; NOW GET THE NEXT EXTENT. - JP RANSIZ1 ; CONTINUE TIL ALL DONE. -RANSIZ3:POP HL ; WE ARE DONE, RESTORE THE STACK AND - RET ; RETURN. -; -; FUNCTION TO RETURN THE RANDOM RECORD POSITION OF A GIVEN -; FILE WHICH HAS BEEN READ IN S.EQUENTIAL MODE UP TO NOW. -; -SETRAN: LD HL,(PARAMS) ; POINT TO FCB. - LD DE,#32 ; AND TO LAST USED RECORD. - CALL COMPRAND ; COMPUTE RANDOM POSITION. - LD HL,#33 ; NOW STUFF THESE VALUES INTO FCB. - ADD HL,DE - LD (HL),C ; MOVE 'R0'. - INC HL - LD (HL),B ; AND 'R1'. - INC HL - LD (HL),A ; AND LASTLY 'R2'. - RET -; -; THIS ROUTINE SELECT THE DRIVE SPECIFIED IN (ACTIVE) AND -; UPDATE THE LOGIN VECTOR AND BITMAP TABLE IF THIS DRIVE WAS -; NOT ALREADY ACTIVE. -; -LOGINDRV: - LD HL,(LOGIN) ; GET THE LOGIN VECTOR. - LD A,(ACTIVE) ; GET THE DEFAULT DRIVE. - LD C,A - CALL SHIFTR ; POSITION ACTIVE BIT FOR THIS DRIVE - PUSH HL ; INTO BIT 0. - EX DE,HL - CALL SELECT ; SELECT THIS DRIVE. - POP HL - CALL Z,SLCTERR ; VALID DRIVE? - LD A,L ; IS THIS A NEWLY ACTIVATED DRIVE? - RRA - RET C - LD HL,(LOGIN) ; YES, UPDATE THE LOGIN VECTOR. - LD C,L - LD B,H - CALL SETBIT - LD (LOGIN),HL ; AND SAVE. - JP BITMAP ; NOW UPDATE THE BITMAP. -; -; FUNCTION TO SET THE ACTIVE DISK NUMBER. -; -SETDSK: LD A,(EPARAM) ; GET PARAMETER PASSED AND SEE IF THIS - LD HL,#ACTIVE ; REPRESENTS A CHANGE IN DRIVES. - CP (HL) - RET Z - LD (HL),A ; YES IT DOES, LOG IT IN. - JP LOGINDRV -; -; THIS IS THE 'AUTO DISK SELECT' ROUTINE. THE FIRSST BYTE -; OF THE FCB IS EXAMINED FOR A DRIVE SPECIFICATION. IF NON -; ZERO THEN THE DRIVE WILL BE SELECTED AND LOGED IN. -; -AUTOSEL:LD A,#0x0FF ; SAY 'AUTO-SELECT ACTIVATED'. - LD (AUTO),A - LD HL,(PARAMS) ; GET DRIVE SPECIFIED. - LD A,(HL) - AND #0x1F ; LOOK AT LOWER 5 BITS. - DEC A ; ADJUST FOR (1=A, 2=B) ETC. - LD (EPARAM),A ; AND SAVE FOR THE SELECT ROUTINE. - CP #0x1E ; CHECK FOR 'NO CHANGE' CONDITION. - JP NC,AUTOSL1 ; YES, DON'T CHANGE. - LD A,(ACTIVE) ; WE MUST CHANGE, SAVE CURRENTLY ACTIVE - LD (OLDDRV),A ; DRIVE. - LD A,(HL) ; AND SAVE FIRST BYTE OF FCB ALSO. - LD (AUTOFLAG),A ; THIS MUST BE NON-ZERO. - AND #0x0E0 ; WHATS THIS FOR (BITS 6,7 ARE USED FOR - LD (HL),A ; SOMETHING)? - CALL SETDSK ; SELECT AND LOG IN THIS DRIVE. -AUTOSL1:LD A,(USERNO) ; MOVE USER NUMBER INTO FCB. - LD HL,(PARAMS) ; (* UPPER HALF OF FIRST BYTE *) - OR (HL) - LD (HL),A - RET ; AND RETURN (ALL DONE). -; -; FUNCTION TO RETURN THE CURRENT CP/M VERSION NUMBER. -; -GETVER: LD A,#0x022 ; VERSION 2.2 - JP SETSTAT -; -; FUNCTION TO RESET THE DISK SYSTEM. -; -RSTDSK: LD HL,#0 ; CLEAR WRITE PROTECT STATUS AND LOG - LD (WRTPRT),HL ; IN VECTOR. - LD (LOGIN),HL - XOR A ; SELECT DRIVE 'A'. - LD (ACTIVE),A - LD HL,#TBUFF ; SETUP DEFAULT DMA ADDRESS. - LD (USERDMA),HL - CALL DEFDMA - JP LOGINDRV ; NOW LOG IN DRIVE 'A'. -; -; FUNCTION TO OPEN A SPECIFIED FILE. -; -OPENFIL:CALL CLEARS2 ; CLEAR 'S2' BYTE. - CALL AUTOSEL ; SELECT PROPER DISK. - JP OPENIT ; AND OPEN THE FILE. -; -; FUNCTION TO CLOSE A SPECIFIED FILE. -; -CLOSEFIL: - CALL AUTOSEL ; SELECT PROPER DISK. - JP CLOSEIT ; AND CLOSE THE FILE. -; -; FUNCTION TO RETURN THE FIRST OCCURENCE OF A SPECIFIED FILE -; NAME. IF THE FIRST BYTE OF THE FCB IS '?' THEN THE NAME WILL -; NOT BE CHECKED (GET THE FIRST ENTRY NO MATTER WHAT). -; -GETFST: LD C,#0 ; PREPARE FOR SPECIAL SEARCH. - EX DE,HL - LD A,(HL) ; IS FIRST BYTE A '?'? - CP #QUESTION - JP Z,GETFST1 ; YES, JUST GET VERY FIRST ENTRY (ZERO LENGTH MATCH). - CALL SETEXT ; GET THE EXTENSION BYTE FROM FCB. - LD A,(HL) ; IS IT '?'? IF YES, THEN WE WANT - CP #QUESTION ; AN ENTRY WITH A SPECIFIC 'S2' BYTE. - CALL NZ,CLEARS2 ; OTHERWISE, LOOK FOR A ZERO 'S2' BYTE. - CALL AUTOSEL ; SELECT PROPER DRIVE. - LD C,#15 ; COMPARE BYTES 0-14 IN FCB (12&13 EXCLUDED). -GETFST1:CALL FINDFST ; FIND AN ENTRY AND THEN MOVE IT INTO - JP MOVEDIR ; THE USERS DMA SPACE. -; -; FUNCTION TO RETURN THE NEXT OCCURENCE OF A FILE NAME. -; -GETNXT: LD HL,(SAVEFCB) ; RESTORE POINTERS. NOTE THAT NO - LD (PARAMS),HL ; OTHER .DBOS CALLS ARE ALLOWED. - CALL AUTOSEL ; NO ERROR WILL BE RETURNED, BUT THE - CALL FINDNXT ; RESULTS WILL BE WRONG. - JP MOVEDIR -; -; FUNCTION TO DELETE A FILE BY NAME. -; -DELFILE:CALL AUTOSEL ; SELECT PROPER DRIVE. - CALL ERAFILE ; ERASE THE FILE. - JP STSTATUS ; SET STATUS AND RETURN. -; -; FUNCTION TO EXECUTE A S.EQUENTIAL READ OF THE SPECIFIED -; RECORD NUMBER. -; -READSEQ:CALL AUTOSEL ; SELECT PROPER DRIVE THEN READ. - JP RDSEQ -; -; FUNCTION TO WRITE THE NET S.EQUENTIAL RECORD. -; -WRTSEQ: CALL AUTOSEL ; SELECT PROPER DRIVE THEN WRITE. - JP WTSEQ -; -; CREATE A FILE FUNCTION. -; -FCREATE:CALL CLEARS2 ; CLEAR THE 'S2' BYTE ON ALL CREATES. - CALL AUTOSEL ; SELECT PROPER DRIVE AND GET THE NEXT - JP GETEMPTY ; EMPTY DIRECTORY SPACE. -; -; FUNCTION TO RENAME A FILE. -; -RENFILE:CALL AUTOSEL ; SELECT PROPER DRIVE AND THEN SWITCH - CALL CHGNAMES ; FILE NAMES. - JP STSTATUS -; -; FUNCTION TO RETURN THE LOGIN VECTOR. -; -GETLOG: LD HL,(LOGIN) - JP GETPRM1 -; -; FUNCTION TO RETURN THE CURRENT DISK ASSIGNMENT. -; -GETCRNT:LD A,(ACTIVE) - JP SETSTAT -; -; FUNCTION TO SET THE DMA ADDRESS. -; -PUTDMA: EX DE,HL - LD (USERDMA),HL ; SAVE IN OUR SPACE AND THEN GET TO - JP DEFDMA ; THE BIOS WITH THIS ALSO. -; -; FUNCTION TO RETURN THE ALLOCATION VECTOR. -; -GETALOC:LD HL,(ALOCVECT) - JP GETPRM1 -; -; FUNCTION TO RETURN THE READ-ONLY STATUS VECTOR. -; -GETROV: LD HL,(WRTPRT) - JP GETPRM1 -; -; FUNCTION TO SET THE FILE ATTRIBUTES (READ-ONLY, SYSTEM). -; -SETATTR:CALL AUTOSEL ; SELECT PROPER DRIVE THEN SAVE ATTRIBUTES. - CALL SAVEATTR - JP STSTATUS -; -; FUNCTION TO RETURN THE ADDRESS OF THE DISK PARAMETER BLOCK -; FOR THE CURRENT DRIVE. -; -GETPARM:LD HL,(DISKPB) -GETPRM1:LD (STATUS),HL - RET -; -; FUNCTION TO GET OR SET THE USER NUMBER. IF (E) WAS (FF) -; THEN THIS IS A R.EQUEST TO RETURN THE CURRENT USER NUMBER. -; ELSE SET THE USER NUMBER FROM (E). -; -GETUSER:LD A,(EPARAM) ; GET PARAMETER. - CP #0x0FF ; GET USER NUMBER? - JP NZ,SETUSER - LD A,(USERNO) ; YES, JUST DO IT. - JP SETSTAT -SETUSER:AND #0x1F ; NO, WE SHOULD SET IT INSTEAD. KEEP LOW - LD (USERNO),A ; BITS (0-4) ONLY. - RET -; -; FUNCTION TO READ A RANDOM RECORD FROM A FILE. -; -RDRANDOM: - CALL AUTOSEL ; SELECT PROPER DRIVE AND READ. - JP READRAN -; -; FUNCTION TO COMPUTE THE FILE SIZE FOR RANDOM FILES. -; -WTRANDOM: - CALL AUTOSEL ; SELECT PROPER DRIVE AND WRITE. - JP WRITERAN -; -; FUNCTION TO COMPUTE THE SIZE OF A RANDOM FILE. -; -FILESIZE: - CALL AUTOSEL ; SELECT PROPER DRIVE AND CHECK FILE LENGTH - JP RANSIZE -; -; FUNCTION #37. THIS ALLOWS A PROGRAM TO LOG OFF ANY DRIVES. -; ON ENTRY, SET (DE) TO CONTAIN A WORD WITH BITS SET FOR THOSE -; DRIVES THAT ARE TO BE LOGGED OFF. THE LOG-IN VECTOR AND THE -; WRITE PROTECT VECTOR WILL BE UPDATED. THIS MUST BE A M/PM -; SPECIAL FUNCTION. -; -LOGOFF: LD HL,(PARAMS) ; GET DRIVES TO LOG OFF. - LD A,L ; FOR EACH BIT THAT IS SET, WE WANT - CPL ; TO CLEAR THAT BIT IN (LOGIN) - LD E,A ; AND (WRTPRT). - LD A,H - CPL - LD HL,(LOGIN) ; RESET THE LOGIN VECTOR. - AND H - LD D,A - LD A,L - AND E - LD E,A - LD HL,(WRTPRT) - EX DE,HL - LD (LOGIN),HL ; AND SAVE. - LD A,L ; NOW DO THE WRITE PROTECT VECTOR. - AND E - LD L,A - LD A,H - AND D - LD H,A - LD (WRTPRT),HL ; AND SAVE. ALL DONE. - RET -; -; GET HERE TO RETURN TO THE USER. -; -GOBACK: LD A,(AUTO) ; WAS AUTO SELECT ACTIVATED? - OR A - JP Z,GOBACK1 - LD HL,(PARAMS) ; YES, BUT WAS A CHANGE MADE? - LD (HL),#0 ; (* RESET FIRST BYTE OF FCB *) - LD A,(AUTOFLAG) - OR A - JP Z,GOBACK1 - LD (HL),A ; YES, RESET FIRST BYTE PROPERLY. - LD A,(OLDDRV) ; AND GET THE OLD DRIVE AND SELECT IT. - LD (EPARAM),A - CALL SETDSK -GOBACK1:LD HL,(USRSTACK) ; RESET THE USERS STACK POINTER. - LD SP,HL - LD HL,(STATUS) ; GET RETURN STATUS. - LD A,L ; FORCE VERSION 1.4 COMPATABILITY. - LD B,H - RET ; AND GO BACK TO USER. -; -; FUNCTION #40. THIS IS A SPECIAL ENTRY TO DO RANDOM I/O. -; FOR THE CASE WHERE WE ARE WRITING TO UNUSED DISK SPACE, THIS -; SPACE WILL BE ZEROED OUT FIRST. THIS MUST BE A M/PM SPECIAL -; PURPOSE FUNCTION, BECAUSE WHY WOULD ANY NORMAL PROGRAM EVEN -; CARE ABOUT THE PREVIOUS CONTENTS OF A SECTOR ABOUT TO BE -; WRITTEN OVER. -; -WTSPECL:CALL AUTOSEL ; SELECT PROPER DRIVE. - LD A,#2 ; USE SPECIAL WRITE MODE. - LD (MODE),A - LD C,#0 ; SET WRITE INDICATOR. - CALL POSITN1 ; POSITION THE FILE. - CALL Z,WTSEQ1 ; AND WRITE (IF NO ERRORS). - RET -; -;************************************************************** -;* -;* BDOS DATA STORAGE POOL. -;* -;************************************************************** -; -EMPTYFCB: - .DB 0x0E5 ; EMPTY DIRECTORY SEGMENT INDICATOR. -WRTPRT: .DW 0 ; WRITE PROTECT STATUS FOR ALL 16 DRIVES. -LOGIN: .DW 0 ; DRIVE ACTIVE WORD (1 BIT PER DRIVE). -USERDMA:.DW 0x80 ; USER'S DMA ADDRESS (DEFAULTS TO 80H). -; -; SCRATCH AREAS FROM PARAMETER BLOCK. -; -SCRATCH1: - .DW 0 ; RELATIVE POSITION WITHIN DIR SEGMENT FOR FILE (0-3). -SCRATCH2: - .DW 0 ; LAST SELECTED TRACK NUMBER. -SCRATCH3: - .DW 0 ; LAST SELECTED SECTOR NUMBER. -; -; DISK STORAGE AREAS FROM PARAMETER BLOCK. -; -DIRBUF: .DW 0 ; ADDRESS OF DIRECTORY BUFFER TO USE. -DISKPB: .DW 0 ; CONTAINS ADDRESS OF DISK PARAMETER BLOCK. -CHKVECT:.DW 0 ; ADDRESS OF CHECK VECTOR. -ALOCVECT: - .DW 0 ; ADDRESS OF ALLOCATION VECTOR (BIT MAP). -; -; PARAMETER BLOCK RETURNED FROM THE BIOS. -; -SECTORS:.DW 0 ; SECTORS PER TRACK FROM BIOS. -BLKSHFT:.DB 0 ; BLOCK SHIFT. -BLKMASK:.DB 0 ; BLOCK MASK. -EXTMASK:.DB 0 ; EXTENT MASK. -DSKSIZE:.DW 0 ; DISK SIZE FROM BIOS (NUMBER OF BLOCKS-1). -DIRSIZE:.DW 0 ; DIRECTORY SIZE. -ALLOC0: .DW 0 ; STORAGE FOR FIRST BYTES OF BIT MAP (DIR SPACE USED). -ALLOC1: .DW 0 -OFFSET: .DW 0 ; FIRST USABLE TRACK NUMBER. -XLATE: .DW 0 ; SECTOR TRANSLATION TABLE ADDRESS. -; -; -CLOSEFLG: - .DB 0 ; CLOSE FLAG (=0FFH IS EXTENT WRITTEN OK). -R.DWRTFLG: - .DB 0 ; READ/WRITE FLAG (0FFH=READ, 0=WRITE). -FNDSTAT:.DB 0 ; FILENAME FOUND STATUS (0=FOUND FIRST ENTRY). -MODE: .DB 0 ; I/O MODE SELECT (0=RANDOM, 1=S.EQUENTIAL, 2=SPECIAL RANDOM). -EPARAM: .DB 0 ; STORAGE FOR REGISTER (E) ON ENTRY TO BDOS. -RELBLOCK: - .DB 0 ; RELATIVE POSITION WITHIN FCB OF BLOCK NUMBER WRITTEN. -COUNTER:.DB 0 ; BYTE COUNTER FOR DIRECTORY NAME SEARCHES. -SAVEFCB:.DW 0,0 ; SAVE SPACE FOR ADDRESS OF FCB (FOR DIRECTORY SEARCHES). -BIGDISK:.DB 0 ; IF =0 THEN DISK IS > 256 BLOCKS LONG. -AUTO: .DB 0 ; IF NON-ZERO, THEN AUTO SELECT ACTIVATED. -OLDDRV: .DB 0 ; ON AUTO SELECT, STORAGE FOR PREVIOUS DRIVE. -AUTOFLAG: - .DB 0 ; IF NON-ZERO, THEN AUTO SELECT CHANGED DRIVES. -SAVNXT: .DB 0 ; STORAGE FOR NEXT RECORD NUMBER TO ACCESS. -SAVEXT: .DB 0 ; STORAGE FOR EXTENT NUMBER OF FILE. -SAVNREC:.DW 0 ; STORAGE FOR NUMBER OF RECORDS IN FILE. -BLKNMBR:.DW 0 ; BLOCK NUMBER (PHYSICAL SECTOR) USED WITHIN A FILE OR LOGICAL SEC -LOGSECT:.DW 0 ; STARTING LOGICAL (128 BYTE) SECTOR OF BLOCK (PHYSICAL SECTOR). -FCBPOS: .DB 0 ; RELATIVE POSITION WITHIN BUFFER FOR FCB OF FILE OF INTEREST. -FILEPOS:.DW 0 ; FILES POSITION WITHIN DIRECTORY (0 TO MAX ENTRIES -1). -; -; DISK DIRECTORY BUFFER CHECKSUM BYTES. ONE FOR EACH OF THE -; 16 POSSIBLE DRIVES. -; -CKSUMTBL: - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -; -;************************************************************** -;* -;* B I O S J U M P T A B L E -;* -;************************************************************** -; - -BIOS = BIOSO ;BIOS ORIGIN -; -BOOT = BIOS ;(BOOT) Cold boot entry -WBOOT = BIOS+3 ;Warm boot entry -CONST = BIOS+6 ;Console status -CONIN = BIOS+9 ;Console char in -CONOUT = BIOS+12 ;Console char out -LIST = BIOS+15 ;List char out -PUNCH = BIOS+18 ;Punch char out -READER = BIOS+21 ;Reader char in -HOME = BIOS+24 ;Home disk -SELDSK = BIOS+27 ;Select disk -SETTRK = BIOS+30 ;Set disk track addr -SETSEC = BIOS+33 ;Set disk sector addr -SETDMA = BIOS+36 ;Set DMA buffer addr -READ = BIOS+39 ;Read sector -WRITE = BIOS+42 ;Write sector -SECTRN = BIOS+48 ;Sector translation routine -; -;dwg; .IF ENDFIL -;dwg; .ORG BDOSO+0DFFH -;dwg; .DB 55H -;dwg; .ENDIF - -;dwg; .END - -_bdos_end:: - .area _CODE - .area _CABS diff --git a/branches/dgg/cpurom/src/cbios.s b/branches/dgg/cpurom/src/cbios.s deleted file mode 100644 index a909bd64..00000000 --- a/branches/dgg/cpurom/src/cbios.s +++ /dev/null @@ -1,2733 +0,0 @@ - .title cbios.s derived from cbios.asm - .sbttl by Douglas Goodall for N8VEM use '11 - - .module cbios - .optsdcc -mz80 - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - .globl _cbios -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - .area _DATA -;-------------------------------------------------------- -; overlayable items in ram -;-------------------------------------------------------- - .area _OVERLAY -;-------------------------------------------------------- -; external initialized ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - .area _HOME - .area _GSINIT - .area _GSFINAL - .area _GSINIT -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - .area _HOME - .area _HOME -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - -; .area _CODE - .area _CBIOS - -_cbios_start:: -_cbios: - -; CBIOS FOR N8VEM -; -; Supports: Floppy, IDE HDD, ATAPI ZIP, RAM & ROM DRIVES, on board 16550, DSKY & VDU CARD -; -; BY ANDREW LYNCH, WITH INPUT FROM MANY SOURCES -; -; DATA CONSTANTS -;__________________________________________________________________________________________________ -FALSE = 0 -TRUE = 1 - -; LIST OF CONDITIONAL ASSEMBLY INSTRUCTIONS - -CONDIDESOFT = TRUE ; IF NO IDE DRIVE, HAS A SIGNIFICANT DELAY ON SOFT BOOT (TRUE) OR QUICK (FALSE) -CONDSHORTMSG = TRUE ; TRUE FOR ORIGINAL WARM BOOT SIGNON, FALSE FOR SHORTER ONE WITH LESS -CONDSUPERSUB = TRUE ; TRUE FOR NO SUPERSUB AUTOEXEC, FALSE TO RUN SUPERSUB AUTOEXEC -CONDABONLY = TRUE ; TRUE FOR ORIGINAL, FALSE TO ONLY HAVE DRIVE A AND B - -CONDUSEVDU = FALSE ; TRUE FOR USE VDU CARD, FALSE TO USE SERIAL PORT (FOR CONSOLE) -CONDUSEFLOPPY = TRUE ; TRUE FOR USE FLOPPY, FALSE FOR NO FLOPPY DRIVE -COND144FLOPPY = TRUE ; TRUE FOR 1.44Mb FLOPPY ON DRIVE G: -CONDUSEATAPI = FALSE ; TRUE FOR USE ZIP DISK, FALSE FOR NO ZIP DISK -CONDUSEDSKY = FALSE ; TRUE FOR USE DSKY, FALSE FOR NO DSKY - -; POINTERS TO VDU ROUTINES IN HIGH ROM BANK (NOT NEEDED IF NOT USING VDU CARD) - -VDU_INIT = 0x0100 ; VECTOR TO VDU INIT CODE -IS_KBHIT = 0x0395 ; VECTOR TO KB HIT CODE -GET_KEY = 0x039C ; VECTOR TO GET KEY CODE -CHARIN = 0x011B ; VECTOR TO CHARIN CODE -PR_OUTCHAR = 0x0CD6 ; VECTOR TO PRINTER CODE - -; -MSIZE = 59 ;CP/M VERSION MEMORY SIZE IN KILOBYTES -; -; "BIAS" IS ADDRESS OFFSET FROM 3400H FOR MEMORY SYSTEMS -; THAN 16K (REFERRED TO AS "B" THROUGHOUT THE TEXT) -; -BIAS = (MSIZE-20)*1024 ; -CCP = 0x3400+BIAS ; BASE OF CCP -BDOS = CCP+0x806 ; BASE OF BDOS -BIOS = CCP+0x1600 ; BASE OF BIOS -CDISK = 4 ; CURRENT DISK NUMBER 0=A,...,15=P -IOBYTE = 3 ; I/O DEFINITION BYTE. - -END = 0x0FF -CR = 0x0D -LF = 0x0A - -; TEST PROTOTYPE SPECIFIC HARDWARE IO PORT ADDRESSES AND MEMORY LOCATIONS - -UART = 0x68 ; BASE IO ADDRESS OF UART -MPCL_RAM = 0x78 ; BASE IO ADDRESS OF RAM MEMORY PAGER CONFIGURATION LATCH -MPCL_ROM = 0x7C ; BASE IO ADDRESS OF ROM MEMORY PAGER CONFIGURATION LATCH - -ROMSTART_CPM= 0x00A00 ; WHERE THE CCP+BDOS+BIOS IS STORED IN ROM -RAMTARG_CPM= 0x0D000 ; WHERE THE CCP+BDOS+BIOS STARTS IN RAM (ENTRY POINT) -MOVSIZ_CPM= 0x02BFF ; CCP, BDOS -CCPSIZ_CPM= 0x00800 ; CCP 0800h BYTES IN LENGTH - -; IDE REGISTER IO PORT ; FUNCTION -IDELO = 0x20 ; DATA PORT (LOW BYTE) -IDEERR = 0x21 ; READ: ERROR REGISTER; WRITE: PRECOMP -IDESECTC = 0x22 ; SECTOR COUNT -IDESECTN = 0x23 ; SECTOR NUMBER -IDECYLLO = 0x24 ; CYLINDER LOW -IDECYLHI = 0x25 ; CYLINDER HIGH -IDEHEAD = 0x26 ; DRIVE/HEAD -IDESTTS = 0x27 ; READ: STATUS; WRITE: COMMAND -IDEHI = 0x28 ; DATA PORT (HIGH BYTE) -IDECTRL = 0x2E ; READ: ALTERNATIVE STATUS; WRITE; DEVICE CONTROL -IDEADDR = 0x2F ; DRIVE ADDRESS (READ ONLY) -FMSR = 0x36 ; ADDRESS OF MAIN STATUS REGISTER -FDATA = 0x37 ; FLOPPY DATA REGISTER -FLATCH = 0x3A ; FLOPPY CONFIGURATION LATCH -FDMA = 0x3C ; PSEUDO DMA ADDRESS -; -; FDC CONFIGURATION LATCH OUTPUT BIT PATTERNS -MOTOR = 0b00000000 ; BIT PATTERN IN LATCH FOR MOTOR CONTROL (ON) -TERMCN = 0b00000001 ; BIT PATTERN IN LATCH TO WRITE A TC STROBE -RESETL = 0b00000010 ; BIT PATTERN IN LATCH TO RESET ALL BITS -MINI = 0b00000100 ; BIT PATTERN IN LATCH TO SET MINI MODE FDC9229 LOW DENS=1, HIGH DENS=0 -PRECOMP = 0b00100000 ; BIT PATTERN IN LATCH TO SET WRITE PRECOMP 125 NS: -FDDENSITY = 0b01000000 ; BIT PATTERN IN LATCH TO FLOPPY LOW DENSITY (HIGH IS 0) -FDREADY = 0b10000000 ; BIT PATTERN IN LATCH TO FLOPPY READY (P-34): -; -; PIO 82C55 I/O IS DECODED TO PORT 60-67 -PORTA = 0x60 ; PORT A -PORTB = 0x61 ; PORT B -PORTC = 0x62 ; PORT C -PIOCONT = 0x63 ; PIO CONTROL PORT - - -;dwg; .ORG BIOS - -;__________________________________________________________________________________________________ -; -; CP/M JUMP VECTOR TABLE FOR INDIVIDUAL SUBROUTINES -;__________________________________________________________________________________________________ -; - JP BOOT ; COLD START -WBOOTE: JP WBOOT ; WARM START - JP CONST ; CONSOLE STATUS - JP CONIN ; CONSOLE CHARACTER IN - JP CONOUT ; CONSOLE CHARACTER OUT - JP LIST ; LIST CHARACTER OUT (NULL ROUTINE) - JP PUNCH ; PUNCH CHARACTER OUT (NULL ROUTINE) - JP READER ; READER CHARACTER OUT (NULL ROUTINE) - JP HOME ; MOVE HEAD TO HOME POSITION - JP SELDSK ; SELECT DISK - JP SETTRK ; SET TRACK NUMBER - JP SETSEC ; SET SECTOR NUMBER - JP SETDMA ; SET DMA ADDRESS - JP READ ; READ DISK - JP WRITE ; WRITE DISK - JP LISTST ; RETURN LIST STATUS (NULL ROUTINE) - JP SECTRN ; SECTOR TRANSLATE - -;__________________________________________________________________________________________________ -; -; FIXED DATA TABLES FOR ALL DRIVES -; 0= FLOPPY DISK OR RAM DISK, 1=RAM DISK, 2=IDE, 3=ATAPI OR RAM DISK, 4=HDPART4 -; 5= 1MB ROM DISK,6=32K ROM DISK -; -; NOTE: The RAM disk area is used as a substitute if the Floppy and/or ZIP drives are not enabled -; in the sustem. This RAM disk is the same "disk" as drive B. -; -;__________________________________________________________________________________________________ - -; DISK PARAMETER HEADER FOR DISK 00 -DPBASE: - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK1 - .DW CHK01,ALL01 - -; DISK PARAMETER HEADER FOR DISK 01 -.IF CONDUSEFLOPPY - .IF COND144FLOPPY - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK7 ; FOR 1.44M FLOPPIES - .DW CHK07,ALL07 - .ELSE - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK0 - .DW CHK00,ALL00 - .ENDIF -.ELSE - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK1 - .DW CHK01,ALL01 -.ENDIF -; DISK PARAMETER HEADER FOR DISK 02 - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK2 - .DW CHK02,ALL02 - - .IF CONDUSEATAPI -; DISK PARAMETER HEADER FOR DISK 03 - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK3 - .DW CHK03,ALL03 - .ELSE - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK1 - .DW CHK01,ALL01 - .ENDIF - -; DISK PARAMETER HEADER FOR DISK 04 - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK4 - .DW CHK04,ALL04 - -; DISK PARAMETER HEADER FOR DISK 05 - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK5 - .DW CHK05,ALL05 - -; DISK PARAMETER HEADER FOR DISK 06 - .DW 0000,0000 - .DW 0000,0000 - .DW DIRBF,DPBLK6 - .DW CHK06,ALL06 -; - -DPBLK0: ; DISK PARAMETER BLOCK (FLOPPY DISK 720KB) -SPT_0: .DW 36 ; 36 SECTORS OF 128 BYTES PER 4.5K TRACK -BSH_0: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_0: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_0: .DB 0 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_0: .DW 350 ; BLOCKSIZE [2048] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_0: .DW 127 ; NUMBER OF DIRECTORY ENTRIES -AL0_0: .DB 0b11000000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_0: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_0: .DW 32 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_0: .DW 4 ; FIRST 4 TRACKS TRACKS RESERVED (18K FOR SYSTEM) - ; -DPBLK1: ; DISK PARAMETER BLOCK (RAMDISK 512K, 448K USABLE) -SPT_1: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_1: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_1: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_1: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_1: .DW 225 ; BLOCKSIZE [2048] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_1: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_1: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_1: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_1: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_1: .DW 1 ; 1 TRACK RESERVED [FIRST 32K OF RAM] - ; -DPBLK2: ; DISK PARAMETER BLOCK (IDE HARD DISK 8MB) -SPT_2: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_2: .DB 5 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_2: .DB 31 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_2: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_2: .DW 2017 ; BLOCKSIZE [4096] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_2: .DW 511 ; NUMBER OF DIRECTORY ENTRIES -AL0_2: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_2: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_2: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_2: .DW 0x03F1 ; TRACKS (32K) RESERVED FOR SYSTEM AND OTHER PARTITIONS - ; -DPBLK3: ; DISK PARAMETER BLOCK (ATAPI DRIVE 8MB) -SPT_3: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_3: .DB 5 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_3: .DB 31 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_3: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_3: .DW 2017 ; BLOCKSIZE [4096] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_3: .DW 511 ; NUMBER OF DIRECTORY ENTRIES -AL0_3: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_3: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_3: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_3: .DW 1 ; 1 TRACK (32K) RESERVED FOR SYSTEM - ; -DPBLK4: ; DISK PARAMETER BLOCK (IDE HARD DISK 1024K) -SPT_4: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_4: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_4: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_4: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_4: .DW 497 ; BLOCKSIZE [2048] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_4: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_4: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_4: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_4: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_4: .DW 1 ; 1 TRACK RESERVED [FIRST 32K OF PARTITION] - ; -DPBLK5: ; DISK PARAMETER BLOCK (ROMDISK 1MB) -SPT_5: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_5: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_5: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_5: .DB 0 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_5: .DW 511 ; BLOCKSIZE [2048] * NUMBER OF BLOCKS +1 =DRIVE SIZE -DRM_5: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_5: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_5: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_5: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_5: .DW 1 ; 1 TRACK RESERVED [FIRST 32K OF ROM] - ; -DPBLK6: ; DISK PARAMETER BLOCK (ROMDISK 32KB) -SPT_6: .DW 16 ; 16 SECTORS OF 128 BYTES PER 2K TRACK -BSH_6: .DB 3 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_6: .DB 7 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_6: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_6: .DW 31 ; BLOCKSIZE [1024] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_6: .DW 31 ; NUMBER OF DIRECTORY ENTRIES -AL0_6: .DB 0b10000000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_6: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_6: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_6: .DW 10 ; FIRST 10 TRACKS TRACKS RESERVED (20K FOR SYSTEM) - ; SYSTEM IS ROM LOADER, CCP, BDOS, CBIOS, AND MONITOR -DPBLK7: ; DISK PARAMETER BLOCK FLOPPY 1.44M -SPT_7: .DW 72 ; 16 SECTORS OF 128 BYTES PER 2K TRACK -BSH_7: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_7: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_7: .DB 0 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_7: .DW 710 ; BLOCKSIZE [1024] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_7: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_7: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_7: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED - -CKS_7: .DW 32 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_7: .DW 2 ; FIRST 10 TRACKS TRACKS RESERVED (20K FOR SYSTEM) - ; SYSTEM IS ROM LOADER, CCP, BDOS, CBIOS, AND MONITOR - ; - ; IMPORTANT NOTE: TRACKS 00h - 0AH OF 2K BYTES - ; EACH ARE MARKED WITH THE OFF_6 SET TO 5 AS - ; SYSTEM TRACKS USABLE ROM DRIVE SPACE - ; STARTING AFTER THE TENTH TRACK (IE, TRACK 0AH) - ; MOST LIKELY FIX TO THIS IS PLACING A DUMMY - ; FIRST 20K ROM CONTAINS THE ROM LOADER, MONITOR, - ; CCP, BDOS, BIOS, ETC (10 TRACKS * 2K EACH) -;__________________________________________________________________________________________________ -; -; END OF FIXED CP/M TABLES -; -; INDIVIDUAL SUBROUTINES TO PERFORM EACH FUNCTION -;__________________________________________________________________________________________________ - - -;___BOOT___________________________________________________________________________________________ -BOOT: ; SIMPLEST CASE IS TO JUST PERFORM PARAMETER INITIALIZATION - ; - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; SWITCH OUT ROM, BRING IN LOWER 32K RAM PAGE - ; - ; - LD A,#0b10000001 ; SWITCH IN FIRST 32K LOWER PAGE (FIRST TRACK) - OUT (MPCL_RAM),A ; - ; FORMATTING THE RAM IS SIMPLE AS CLEARING THE DIRECTORY AREA - ; TO A VALUE OF E5H (THE FIRST 8K OF TRACK 1 OR THE RAMDISK) - LD HL,#0000 ; STARTING MEMORY ADDRESS OF TRACK 1, SECTOR 0 IN HL - LD BC,#0x1FFF ; 8K OF DIRECTORY SECTORS RESERVED (LENGTH IN BC) - LD A,#0x0E5 ; INITIALIZING VALUE IN A - LD E,L ; - LD D,H ; - INC DE ; - LD (HL),A ; - LDIR ; - ; - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; SWITCH OUT ROM, BRING IN LOWER 32K RAM PAGE - ; - LD A,#0 ; ENSURE LOWEST RAM PAGE SELECTED - OUT (MPCL_RAM),A ; BRING IN LOWEST 32K RAM PAGE - ; - XOR A ; ZERO IN THE ACCUM - LD (IOBYTE),A ; CLEAR THE IOBYTE - LD (CDISK),A ; SELECT DISK 0 - ; - CALL IDE_SOFT_RESET ; RESET THE IDE HARD DISK - ; - ; - JP GOCPM ; INITIALIZE AND GO TO CP/M - ; -; -;___WBOOT__________________________________________________________________________________________ -WBOOT: ; SIMPLEST CASE IS TO READ THE DISK UNTIL ALL SECTORS LOADED - ; WITH A ROMDISK WE SELECT THE ROM AND THE CORRECT PAGE [0] - ; THEN COPY THE CP/M IMAGE (CCP, BDOS, BIOS, MONITOR) TO HIGH RAM - ; LOAD ADDRESS - ; FOR Z80 IT LOOKS LIKE THIS . USING 8080 NEMONICS - ; - DI ; DISABLE INTERRUPT - LD SP,#0x80 ; USE SPACE BELOW BUFFER FOR STACK - IM 1 ; SET INTERRUPT MODE 1 - ; - XOR A ; CHEAP ZERO IN ACC - OUT (MPCL_ROM),A ; SEND 0 TO ROM MAP PORT (SWITCH IN LOWER 32K ROM PAGE) - ; - XOR A ; CHEAP ZERO IN ACC - OUT (MPCL_RAM),A ; SEND 0 TO RAM MAP PORT (SELECT LOWEST RAM PAGE) - ; - LD HL,#ROMSTART_CPM ; WHERE IN ROM CP/M IS STORED (FIRST BYTE) - LD DE,#RAMTARG_CPM ; WHERE IN RAM TO MOVE MONITOR TO (FIRST BYTE) - LD BC,#CCPSIZ_CPM ; NUMBER OF BYTES TO MOVE FROM ROM TO RAM - LDIR ; - ; - ; -;;;;; EI ; ENABLE INTERRUPTS - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; SWITCH OUT ROM, BRING IN LOWER 32K RAM PAGE - ; - XOR A ; CHEAP ZERO IN ACC - OUT (MPCL_RAM),A ; SEND 0 TO RAM MAP PORT (SELECT LOWEST RAM PAGE) - ; - CALL IDE_SOFT_RESET ; RESET THE IDE HARD DISK - ; - .IF CONDSUPERSUB ; - ; DO NOTHING FOR ORIGINAL CODE - .ELSE ; - ; CLEAR THE AUTOSUB BUFFER, DO ON A WARM BOOT - XOR A ; - LD (INBUFF+1),A ; SECOND BYTE IS ACTUAL LENGTH - .ENDIF ; - ; FALL THROUGH TO GOCPM ROUTINE -; -; END OF LOAD OPERATION, SET PARAMETERS AND GO TO CP/M -; -;___GOCPM__________________________________________________________________________________________ -GOCPM: - ; CPU RESET HANDLER - LD A,#0x0C3 ; C3 IS A JMP INSTRUCTION - LD (0),A ; FOR JMP TO WBOOT - LD HL,#WBOOTE ; WBOOT ENTRY POINT - LD (1),HL ; SET ADDRESS FIELD FOR JMP AT 0 - ; - ; CPU INTERRUPT HANDLER - LD A,#0x0C3 ; C3 IS A JMP INSTRUCTION - LD (0x0038),A ; FOR JMP TO WBOOT - LD HL,#WBOOTE ; WBOOT ENTRY POINT - LD (1),HL ; SET ADDRESS FIELD FOR JMP AT 0 - ; - LD (5),A ; FOR JMP TO BDOS - LD HL,#BDOS ; BDOS ENTRY POINT - LD (6),HL ; ADDRESS FIELD OF JUMP AT 5 TO BDOS - ; - LD BC,#0x80 ; DEFAULT DMA ADDRESS IS 80H - CALL SETDMA ; - ; - .IF CONDUSEFLOPPY ; - CALL SETUPDRIVE ; SETUP FLOPPY PARAMETERS - .ENDIF ; - ; - .IF CONDUSEVDU ; - DI ; DISABLE INTERRUPTS - LD A,#0x1F ; SET HIGH ROM PAGE - OUT (MPCL_ROM),A ; SEND TO ROM PORT MAPPER - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL VDU_INIT ; - LD SP,(PARKSTACK) ; RESTORE STACK - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; - LD A,#0 ; CHOOSE HIGHEST RAM PAGE - OUT (MPCL_RAM),A ; SEND 19H TO RAM MAP PORT (SELECT HIGHEST RAM PAGE) -;;;;; EI ; ENABLE INTERRUPTS - .ENDIF ; - LD HL,#TXT_STARTUP_MSG ; PRINT STARTUP MESSAGE - CALL PRTMSG ; - ; - LD A,(CDISK) ; GET CURRENT DISK NUMBER - LD C,A ; SEND TO THE CCP - JP CCP ; GO TO CP/M FOR FURTHER PROCESSING - ; -;__________________________________________________________________________________________________ -; -; ** CONSOLE & PRINTER I/O -- VDU CARD DRIVER INTERFACE -; -;__________________________________________________________________________________________________ - .IF CONDUSEVDU -CONST: - PUSH HL ; STORE HL - DI ; DISABLE INTERRUPTS - LD A,#1FH ; SET HIGH ROM PAGE - OUT (MPCL_ROM),A ; SEND TO ROM PORT MAPPER - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL IS_KBHIT ; CHECK FOR KB HIT - LD C,A ; STORE RESULT - LD SP,(PARKSTACK) ; RESTORE STACK - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; - LD A,#0 ; CHOOSE HIGHEST RAM PAGE - OUT (MPCL_RAM),A ; SEND 19H TO RAM MAP PORT (SELECT HIGHEST RAM PAGE) - LD A,C ; RESTORE RESULT -;;;;; EI ; ENABLE INTERRUPTS - POP HL ; RESTORE HL - RET - -CONIN: - PUSH HL ; STORE HL - DI ; DISABLE INTERRUPTS - LD A,#0x1F ; SET HIGH ROM PAGE - OUT (MPCL_ROM),A ; SEND TO ROM PORT MAPPER - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL GET_KEY ; GET KEY FROM KEYBOARD - LD C,A ; STORE RESULT - LD SP,(PARKSTACK) ; RESTORE STACK - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; - LD A,#0x00 ; CHOOSE HIGHEST RAM PAGE - OUT (MPCL_RAM),A ; SEND 19H TO RAM MAP PORT (SELECT HIGHEST RAM PAGE) - LD A,C ; RESTORE RESULT -;;;;; EI ; ENABLE INTERRUPTS - POP HL ; RESTORE HL - RET - -CONOUT: - PUSH HL ; STORE HL - DI ; DISABLE INTERRUPTS - LD A,#0x1F ; SET HIGH ROM PAGE - OUT (MPCL_ROM),A ; SEND TO ROM PORT MAPPER - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - LD A,C ; RESTORE CHARACTER - CALL CHARIN ; DISPLAY CHARACTER - LD SP,(PARKSTACK) ; RESTORE STACK - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; - LD A,#0x00 ; CHOOSE HIGHEST RAM PAGE - OUT (MPCL_RAM),A ; SEND 19H TO RAM MAP PORT (SELECT HIGHEST RAM PAGE) -;;;;; EI ; ENABLE INTERRUPTS - POP HL ; RESTORE HL - RET -LIST: - PUSH HL ; STORE HL - DI ; DISABLE INTERRUPTS - LD A,#0x1F ; SET HIGH ROM PAGE - OUT (MPCL_ROM),A ; SEND TO ROM PORT MAPPER - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - LD A,C ; RESTORE CHARACTER - CALL PR_OUTCHAR ; - LD SP,(PARKSTACK) ; RESTORE STACK - LD A,#0x80 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; - LD A,#0x00 ; CHOOSE HIGHEST RAM PAGE - OUT (MPCL_RAM),A ; SEND 19H TO RAM MAP PORT (SELECT HIGHEST RAM PAGE) -;;;;; EI ; ENABLE INTERRUPTS - POP HL ; RESTORE HL - RET - -;__________________________________________________________________________________________________ -; -; ** CONSOLE I/O -- ON-BOARD 16550 SERIAL INTERFACE -; -;__________________________________________________________________________________________________ - .ELSE -CONST: ; CONSOLE STATUS, RETURN 0FFH IF CHARACTER READY, 00H IF NOT - IN A,(UART + 5) ; READ LINE STATUS REGISTER (UART5 = 068h + $05) - AND #0x01 ; TEST IF DATA IN RECEIVE BUFFER - ; IS THERE A CHAR READY? 0=NO, 1=YES - JP Z,NOT_READY ; - LD A,#0x0FF ; YES, PUT 0FFh IN A AND RETURN -NOT_READY: ; - ; NO, LEAVE 000h IN A AND RETURN - RET ; -CONIN: ; CONSOLE CHARACTER INTO REGISTER A - ; - CALL CONST ; IS A CHAR READY TO BE READ FROM UART? - CP #0 ; - JP Z,CONIN ; NO? TRY AGAIN - IN A,(UART) ; YES? READ THE CHAR FROM THE UART (UART0 = 068h + $00) - ; REGISTER AND PASS BACK TO USER - RET ; - ; -CONOUT: ; CONSOLE CHARACTER OUTPUT FROM REGISTER C - IN A,(UART + 5) ; READ LINE STATUS REGISTER - AND #0x20 ; TEST IF UART IS READY TO SEND - JP Z,CONOUT ; IF NOT REPEAT - ; - LD A,C ; GET TO ACCUMULATOR - OUT (UART),A ; THEN WRITE THE CHAR TO UART (UART0 = 068h + $00) - RET ; - ; -LIST: ;LIST CHARACTER FROM REGISTER C - LD A,C ;CHARACTER TO REGISTER A - RET ;NULL SUBROUTINE - .ENDIF - ; -LISTST: ;RETURN LIST STATUS (0 IF NOT READY, 1 IF READY) - XOR A ;0 IS ALWAYS OK TO RETURN - RET ; - ; - ; -;__________________________________________________________________________________________________ -; -; ** PUNCH & READER I/O -- STUB -; -;__________________________________________________________________________________________________ -PUNCH: ;PUNCH CHARACTER FROM REGISTER C - LD A,C ;CHARACTER TO REGISTER A - RET ;NULL SUBROUTINE - ; -READER: ;READ CHARACTER INTO REGISTER A FROM READER DEVICE - LD A,C ;CHARACTER TO REGISTER A - RET - - -;__________________________________________________________________________________________________ -; -; ** DISK STORAGE I/O -; -;__________________________________________________________________________________________________ -; -; SELECT DISK GIVEN BY REGISTER C -;__________________________________________________________________________________________________ - -SELDSK: LD HL,#0x0000 ; ERROR RETURN CODE - LD A,C ; - .IF CONDABONLY ; - CP #7 ; MUST BE BETWEEN 0 AND 6 - .ELSE ; - CP #2 ; IF NO IDE THEN ONLY DRIVE A AND B FOR THE MINI N8VEM SO 0 OR 1 ONLY - .ENDIF ; - RET NC ; RETURN IF OUT OF RANGE - LD (DISKNO),A ; - ; DISK NUMBER IS IN THE PROPER RANGE - ; COMPUTE PROPER DISK PARAMETER HEADER ADDRESS - LD L,A ; L=DISK NUMBER 0,1,2,3,4 - LD H,#0 ; HIGH ORDER ZERO - ADD HL,HL ; *2 - ADD HL,HL ; *4 - ADD HL,HL ; *8 - ADD HL,HL ; *16 (SIZE OF EACH HEADER) - LD DE,#DPBASE ; - ADD HL,DE ; HL= DPBASE(DISKNO*16) - RET -;__________________________________________________________________________________________________ -HOME: ; MOVE TO THE TRACK 00 POSITION OF CURRENT DRIVE - ; TRANSLATE THIS CALL INTO A SETTRK CALL WITH PARAMETER 00 - LD BC,#0 ; SELECT TRACK 0000 -;__________________________________________________________________________________________________ -SETTRK: ; SET TRACK GIVEN BY REGISTER BC - LD H,B ; - LD L,C ; - LD (TRACK),HL ; - RET -;__________________________________________________________________________________________________ -SETSEC: ; SET SECTOR GIVEN BY REGISTER BC - LD H,B ; - LD L,C ; - LD (SECTOR),HL ; - RET ; -;__________________________________________________________________________________________________ -; -; TRANSLATE THE SECTOR GIVEN BY BC USING THE -; TRANSLATE TABLE GIVEN BY DE -; ONLY USED FOR FLOPPIES! FOR ROMDISK/RAMDISK/IDE/ATAPI IT'S 1:1 -; DO THE NEXT ROUTINE IS A NULL (RETURNS THE SAME) -;__________________________________________________________________________________________________ -SECTRN: - LD H,B ; - LD L,C ; - RET ; -;__________________________________________________________________________________________________ -SETDMA: ; SET DMA ADDRESS GIVEN BY REGISTERS B AND C - LD L,C ; LOW ORDER ADDRESS - LD H,B ; HIGH ORDER ADDRESS - LD (DMAAD),HL ; SAVE THE ADDRESS - RET -;________________________________________________________________________________________________________ -; DISK DRIVERS . -; -; DRIVER NEEDS TO DO SEVERAL THINGS FOR ROM AND RAM DISKS -; - INTERRUPTS ARE NOT ALLOWED DURING LOW RAM/ROM ACCESS (DISABLE!) -; -TRANSLATE TRACK AND SECTOR INTO A POINTER TO WHERE THE 128 BYTE -; SECTOR BEGINS IN THE RAM/ROM -; -TRANSLATE THE DRIVE INTO A RAM/ROM SELECT, COMBINE WITH TRACK ADDRESS -; AND SEND TO THE MAP PORT -; -COPY 128 BYTE FROM OR TO THE ROM/RAMDISK AND MEMORY POINTED TO BY THE DMA -; ADDRESS PREVIOUSLY STORED -; -RESTORE MAP PORT TO PRIOR CONDITION BEFOR READ/WRITE -; -; - FIRST TRICK IS THAT WE MADE SECTORS 256 AS 256*128=32768 SO WE COPY -; THE LOW SECTOR ADDRESS TO THE LOW BYTE OF THE HL REGISTER AND THEN -; MULTIPLY BY 128 THIS RESULTS IN THE STARTING ADDRESS IN THE RAM OR ROM -; (0000 -> 7F80H) 32K PAGE -; -; - TRICK TWO IS THE TRACK ADDRESS EQUALS THE 32K PAGE ADDRESS AND IS A -; DIRECT SELECT THAT CAN BE COPIED TO THE MAP PORT D0 THROUGH D5 D7 -; SELECTS THE DRIVE (ROM OR RAM) -; THAT MEANS THE LOW BYTE OF TRACK CONTAINS THE D0-D5 VALUE AND -; DISKNO HAS THE DRIVE SELECTED WE FIRST COPY DISKNO TO ACC -; AND RIGHTSHIFT IT TO PLACE THAT IN BIT 7, WE THEN ADD THE LOW BYTE OF -; TRACK TO ACC AND THEN SEND THAT TO THE MAP PORT -; -; NOTE 1: A WRITE TO ROM SHOULD BE FLAGGED AS AN ERROR -; NOTE 2: RAM MUST START AS A "FORMATTED DISK" IF BATTERY BACKED UP -; IT'S A DO ONCE AT COLD COLD START IF NOT BATTERY BACKED U -; IT WILL HAVE TO BE DONE EVERY TIME THE SYSTEM IS POWERED -; FORMATTING THE RAM IS SIMPLE AS CLEARING THE DIRECTORY AREA -; TO A VALUE OF E5H (THE FIRST 8K OF TRACK 1 OR THE RAMDISK) -; IT COULD BE DONE AS A SIMPLE UTILITY PROGRAM STORED IN ROMD -; OR ANYTIME COLBOOT IS CALLED(LESS DESIREABLE) -; -; -WE NOW CAN COPY TO OR FROM AS CORRECT FOR THE DEVICE 128 BYTES (SECTOR) -; TO OR FROM THE DMA ADDRESS ALMOST! SINCE ROM OR RAM IS BEING PAGED -; WE HAVE TO COPY ANYTHING DETINED FOR BELOW 8000H TO A TEMP BUFFER THEN -; HANDLE THE PAGING -; -; -; - LAST STEP IS TO RESTORE THE MAP PORT TO POINT TO THE RAM (TRACK 0) SO T -; MEMORY MAP IS ALL RAM AGAIN AND NOT POINTING INTO THE DATA AREAS OR THE -; SINCE THE RAM 0TH PAGE IS NOMINALLY THE LOW 32K OF RAM IN THE SYSTEM WE -; SEND A SIMPLE MVI A,80H ; OUT MPCL_ROM ; MVI A,00H ; OUT MPCL_RAM -; -; - THE READ OR WRITE OPERATION IS DONE -; -; READ DISK -; USES DE,DL, BC, ACC FLAGS -; Z80 COULD USE BLOCK MOVE [LDIR] BUT WRITTEN IN 8080 -;________________________________________________________________________________________________________ - -;__READ__________________________________________________________________________________________________ -; -; PERFORM CP/M SECTOR READ -;________________________________________________________________________________________________________ -READ: - DI ; DISABLE INTERRUPTS - LD A,(DISKNO) ; GET DRIVE - CP #0x01 ; "B" - .IF CONDUSEFLOPPY - JP Z,READ_FLPY_DSK ; READ FLOPPY - .ELSE - JP Z,READ_RAM_DISK ; READ FROM 448K RAM DISK - .ENDIF - CP #0 ; "B" - JP Z,READ_RAM_DISK ; READ FROM 448K RAM DISK - CP #2 ; "C" - JP Z,READ_IDE ; READ FROM 8 MB IDE HARD DISK - CP #3 ; "D" - .IF CONDUSEATAPI - JP Z,READ_ATAPI ; READ FROM 8 MB ATAPI - .ELSE - JP Z,READ_RAM_DISK ; READ FROM 448K RAM DISK - .ENDIF - - CP #4 ; "E" - JP Z,READ_HDPART4 ; READ FROM 1 MB IDE HARD DISK, PARTITION 4 ** future use - CP #5 ; "F" - JP Z,READ_RAM_DISK ; READ FROM 1M ROM DISK (UTILIZES SAME - ; ROUTINES AS RAM_DISK - ; "G" - ; READ FROM 22K EEPROM DISK , SO FALL THROUGH - -;___READ_EEPROM_DISK_____________________________________________________________________________________ -; -; READ EEPROM DISK -;________________________________________________________________________________________________________ -READ_EEPROM_DISK: - ; - ; IF ROM, MAP TRACK/SECTOR TO VIRTUAL TRACK/SECTOR - ; HANDLE READING FROM ROM HERE - ; - ; PURPOSE OF THIS ROUTINE IS TO MAP 32K ROM PART - ; TRACK/SECTOR MAP (2K TRACK SIZE MADE OF 16 128 - ; BYTE SECTORS EACH) ONTO WHAT THE RAM/ROM SECTOR - ; READ ROUTINES ARE EXPECTING (32K TRACK SIZE MADE - ; OF 256 128 BYTE SECTORS EACH) THE ROUTINE - ; CONVERTS 4 BIT TRACK # AND 4 BIT SECTOR # - ; INTO A VIRTUAL 1 TRACK, 256 SECTOR ACCESS - LD HL,(TRACK) ; TRACK # IS UPPER 4 BITS OF SECTOR ADDRESS - ADD HL,HL ; SHIFT BITS LEFT 1 (*2) - ADD HL,HL ; SHIFT BITS LEFT 1 (*4) - ADD HL,HL ; SHIFT BITS LEFT 1 (*8) - ADD HL,HL ; SHIFT BITS LEFT 1 (*16) - LD B,H ; PUT UPPER 4 BITS OF SECTOR ADDRESS IN BC - LD C,L ; (B IS UPPER BYTE AND C IS LOWER BYTE) - ; BC NOW CONTAINS THE UPDATED TRACK # - LD HL,(SECTOR) ; SECTOR # IS LOWER 4 BITS OF SECTOR ADDRESS - ADD HL,BC ; VIRTUAL SECTOR = (UPDATED TRACK #) + SECTOR # - LD (PSECTOR),HL ; STORE VIRTUAL SECTOR # - ; NOW CONTINUE READING ROM WITH REGULAR RAM - ; SETUP FOR READ OF RAM OR ROM DISK - LD HL,(PSECTOR) ; - ADD HL,HL ; SHIFT BITS LEFT 1 (*2) - ADD HL,HL ; SHIFT BITS LEFT 1 (*4) - ADD HL,HL ; SHIFT BITS LEFT 1 (*8) - ADD HL,HL ; SHIFT BITS LEFT 1 (*16) - ADD HL,HL ; SHIFT BITS LEFT 1 (*32) - ADD HL,HL ; SHIFT BITS LEFT 1 (*64) - ADD HL,HL ; SHIFT BITS LEFT 1 (*128) - LD (SECST),HL ; SAVE SECTOR STARTING ADDRESS - ; SET PAGER WITH DRIVE (0) AND TRACK (0) - LD A,#0 ; SWITCH IN ROM PAGE - OUT (MPCL_ROM),A ; SEND TO PORT MAPPER - LD (PAGER),A ; SAVE COPY (JUST BECAUSE) - LD HL,#SECTOR_BUFFER ; LOAD HL WITH TEMP BUF ADDRESS - LD E,L ; - LD D,H ; GET IT INTO DE - LD HL,(SECST) ; GET ROM/RAM ADDRESS - CALL COPY_CPM_SECTOR ; - CALL RPAGE ; SET PAGE TO CP/M RAM - LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS - LD E,L ; - LD D,H ; GET IT INTO DE - LD HL,#SECTOR_BUFFER ; GET ROM/RAM ADDRESS - CALL COPY_CPM_SECTOR ; - LD A,(DISKNO) ; STORE CURRENT DRIVE IN BUFFER - LD (CUDISK),A ; - LD A,#0 ; -;;;;; EI ; RE-ENABLE INTERRUPTS - RET -;___READ_RAM_DISK_________________________________________________________________________________________ -; -; READ RAM DISK -;________________________________________________________________________________________________________ -READ_RAM_DISK: ; - ; IF RAM, PROCEED WITH NORMAL TRACK/SECTOR READ - CALL SECPAGE ; SETUP FOR READ OF RAM OR ROM DISK - CALL PAGERB ; SET PAGER WITH DRIVE AND TRACK - LD HL,#SECTOR_BUFFER ; LOAD HL WITH TEMP BUF ADDRESS - LD E,L ; - LD D,H ; GET IT INTO DE - LD HL,(SECST) ; GET ROM/RAM ADDRESS - CALL COPY_CPM_SECTOR ; MOVE SECTOR TO SECTOR_BUFFER - CALL RPAGE ; SET PAGE TO CP/M RAM - LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS ; - LD E,L ; - LD D,H ; GET IT INTO DE - LD HL,#SECTOR_BUFFER ; GET ROM/RAM ADDRESS - CALL COPY_CPM_SECTOR ; MOVE SECTOR FROM SECTOR_BUFFER TO DMA AREA - LD A,(DISKNO) ; STORE CURRENT DRIVE IN BUFFER - LD (CUDISK),A ; - LD A,#0 ; -;;;;; EI ; RE-ENABLE INTERRUPTS - RET - -;___TRFLSEC______________________________________________________________________________________________ -; -; TRANSLATE LOGICAL FLOPPY DISK SECTOR TO PHYSICAL SECTOR -; IN: TRACK,SECTOR -; OUT: PTRACK,PSECTOR,SECTOR_INDEX -;________________________________________________________________________________________________________ -TRFLSEC: - LD A,(TRACK) ; LOAD TRACK # (LOW BYTE) - AND #1 ; FILTER OUT HEAD - LD (HEAD),A ; STORE HEAD - LD A,(TRACK) ; SAVE TRACK IN A - SRL A ; REMOVE HEAD BIT - LD (PTRACK),A ; STORE IN TRACK - LD A,(SECTOR) ; LOAD SECTOR # (LOW BYTE) - LD (SECTOR_INDEX),A ; STORE SECTOR IN SECTOR INDEX - SRL A ; - SRL A ; DIVIDE BY 4 (FOR BLOCKING) - LD (PSECTOR),A ; STORE IN SECTOR - LD A,(SECTOR_INDEX) ; FILTER OUT UNWANTED BITS - AND #3 ; - LD (SECTOR_INDEX),A ; - RET - -;___DEBSEC_______________________________________________________________________________________________ -; -; DEBLOCK 512 BYTE SECTOR FOR CP/M -; -;________________________________________________________________________________________________________ -DEBSEC: - LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS - LD D,H ; TRANSFER HL REGISTERS TO DE - LD E,L ; - PUSH DE ; STORE DE - ; COMPUTE STARTING ADDRESS OF CP/M SECTOR IN READ SECTOR BUFFER - LD HL,#SECTOR_BUFFER ; LOAD HL WITH SECTOR BUFFER ADDRESS - LD A,(SECTOR_INDEX) ; GET THE SECTOR INDEX (CP/M SECTOR OFFSET IN BUFFER) - RRCA ; MOVE BIT 0 TO BIT 7 - RRCA ; DO AGAIN - IN EFFECT MULTIPLY BY 4 - LD D,#0 ; PUT RESULT AS 16 VALUE IN DE, UPPER BYTE IN D IS 000h - LD E,A ; PUT ADDRESS OFFSET IN E - ADD HL,DE ; MULTIPLY BY 2, TOTAL MULTIPLICATION IS X 128 - ADD HL,DE ; CP/M SECTOR STARTING ADDRESS IN IDE HD SECTOR BUFFER - ; COPY CP/M SECTOR TO BDOS DMA ADDRESS BUFFER - POP DE ; RESTORE DE - CALL COPY_CPM_SECTOR ; - RET - -;___BLKSEC_______________________________________________________________________________________________ -; -; BLOCK 512 BYTE SECTOR FOR CP/M -; -;________________________________________________________________________________________________________ -BLKSEC: - ; COMPUTE STARTING ADDRESS OF CP/M SECTOR IN READ SECTOR BUFFER - LD HL,#SECTOR_BUFFER ; LOAD HL WITH SECTOR BUFFER ADDRESS - LD A,(SECTOR_INDEX) ; GET THE SECTOR INDEX (CP/M SECTOR OFFSET IN BUFFER) - RRCA ; MOVE BIT 0 TO BIT 7 - RRCA ; DO AGAIN - IN EFFECT MULTIPLY BY 64 - LD D,#0 ; PUT RESULT AS 16 VALUE IN DE, UPPER BYTE IN D IS 000h - LD E,A ; PUT ADDRESS OFFSET IN E - ADD HL,DE ; CP/M SECTOR STARTING ADDRESS IN IDE HD SECTOR BUFFER - ADD HL,DE ; MULTIPLY BY 2, TOTAL MULTIPLICATION IS X 128 - LD (SECST),HL ; KEEP CP/M SECTOR ADDRESS FOR LATER USE - ; COPY CP/M SECTOR FROM BDOS DMA ADDRESS BUFFER - LD HL,(SECST) ; LOAD CP/M SECTOR ADDRESS (WHERE THE DATA IS TO BE WRITTEN) - LD D,H ; TRANSFER HL REGISTERS TO DE - LD E,L ; - LD HL,(DMAAD) ; LOAD HL WITH DMA ADDRESS (WHERE THE DATA TO BE WRITTEN IS) - CALL COPY_CPM_SECTOR ; - RET - -;___ISCUR_______________________________________________________________________________________________ -; -; IS CURRENT SECTOR IN BUFFER? -; -;________________________________________________________________________________________________________ -ISCUR: - LD HL,(PSECTOR) ; COMPARE REQUESTED SECTOR WITH SECTOR IN BUFFER - LD A,(CUSECTOR) ; - CP L ; - RET NZ ; LOW BYTE NOT EQUAL - LD A,(CUSECTOR+1) ; - CP H ; - RET NZ ; HIGH BYTE NOT EQUAL - LD HL,(PTRACK) ; COMPARE REQUESTED TRACK WITH TRACK IN BUFFER - LD A,(CUTRACK) ; - CP L ; LOW BYTE NOT EQUAL - RET NZ ; - LD A,(CUTRACK+1) ; - CP H ; - RET NZ ; HIGH BYTE NOT EQUAL - LD HL,(DISKNO) ; COMPARE REQUESTED DRIVE WITH DRIVE IN BUFFER - LD A,(CUDISK) ; - CP L ; - RET ; EXIT WITH RESULT - -;___READ_FLPY_DSK________________________________________________________________________________________ -; -; READ FLOPPY DISK -; -;________________________________________________________________________________________________________ - -READ_FLPY_DSK: - DI ; DISABLE INTERRUPTS - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL TRFLSEC ; TRANSLATE SECTOR INFORMATION - CALL READ_FLPY_SEC ; - CALL DEBSEC ; DEBLOCK SECTOR - LD A,(ST1) ; LOAD RESULT CODE INTO A -READ_FLPY_DSK_EXIT: ; - LD SP,(PARKSTACK) ; RETURN STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - RET - - -;___READ_FLPY_SEC________________________________________________________________________________________ -; -; READ A SECTOR FROM A FLOPPY DISK -; -;________________________________________________________________________________________________________ -READ_FLPY_SEC: - LD A,#0 ; RESET STATUS FLAG 1 - LD (ST1),A ; - CALL ISCUR ; IS CURRENT SECTOR ALREADY IN BUFFER - JP Z,READ_FLPY_SEC_OK - LD A,#20 ; 20 RETRIES - LD (RETRY),A ; - LD A,#2 ; 2 ITERATIONS OF RETRIES - LD (RETRY1),A ; -READ_FLPY_SEC_RETRY: ; - CALL FLOPPYREAD ; READ THE FLOPPY DISK SECTOR - LD A,(ST0) ; GET STATUS FLAG 0 - AND #0x0F8 ; MASK OF DRIVE AND HEAD SELECTION - LD B,A ; MOVE STATUS FLAG 0 TO B - LD A,(ST1) ; GET STATUS FLAG 1 - OR B ; IF ZERO READ WAS OK - JP Z,READ_FLPY_SEC_OK - LD A,(RETRY) ; READ NOT OK, DEC RETRY COUNTER - DEC A ; - LD (RETRY),A ; STORE NEW RETRY COUNTER - JP NZ,READ_FLPY_SEC_RETRY - CALL CYCLEFLOPPY ; CYCLE FLOPPY HEAD - LD A,#20 ; RESET TO 20 RETRIES - LD (RETRY),A ; STORE RETRY COUNTER - LD A,(RETRY1) ; DEC RETRY ITERATION COUNTER - DEC A ; - LD (RETRY1),A ; - JP NZ,READ_FLPY_SEC_RETRY - LD HL,#0x0FFFF ; SET INVALID CONDITION, BUFFER IS INVALID - LD (CUSECTOR),HL ; CURRENT PHYSICAL DISK SECTOR IN BUFFER - LD (CUTRACK),HL ; CURRENT PHYSICAL DISK TRACK IN BUFFER - RET ; -READ_FLPY_SEC_OK: ; - LD HL,(PSECTOR) ; STORE PHYSICAL SECTOR IN BUFFER - LD (CUSECTOR),HL ; - LD HL,(PTRACK) ; STORE PHYSICAL DISK TRACK IN BUFFER - LD (CUTRACK),HL ; - LD A,(DISKNO) ; STORE CURRENT DRIVE IN BUFFER - LD (CUDISK),A ; - RET - -;___READ_IDE_____________________________________________________________________________________________ -; -; READ FROM IDE HARD DISK -;________________________________________________________________________________________________________ - -READ_IDE: - DI ; DISABLE INTERRUPTS - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - ; DISABLE INTERRUPTS - CALL CONVERT_IDE_SECTOR_CPM - CALL IDE_READ_SECTOR ; READ THE IDE HARD DISK SECTOR - JP NC,READ_IDE_ERROR - CALL DEBSEC ; - LD SP,(PARKSTACK) ; RETURN STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0 ; RETURN ERROR CODE READ SUCCESSFUL A=0 - RET ; -READ_IDE_ERROR: ; - LD SP,(PARKSTACK) ; RETURN STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0x0FF ; RETURN ERROR CODE READ ERROR A=FF - RET - -;___READ_ATAPI_________________________________________________________________________________________ -; -; READ FROM ATAPI DEVICE -;________________________________________________________________________________________________________ -READ_ATAPI: - LD A,#0x0FF ; 255 RETRIES - LD (RETRY),A ; -READ_ATAPI_RETRY: - LD A,#0x10 ; SET TO SECONDARY DEVICE - LD (IDEDEVICE),A ; - DI ; DISABLE INTERRUPTS - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL CONVERT_IDE_SECTOR_CPM - CALL ATAPI_READ_SECTOR - JP NC,READ_ATAPI_ERROR - CALL DEBSEC ; - LD SP,(PARKSTACK) ; RETURN STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0 ; RETURN ERROR CODE READ SUCCESSFUL A=0 - RET ; -READ_ATAPI_ERROR: - LD A,(RETRY) ; READ NOT OK, DEC RETRY COUNTER - DEC A ; - LD (RETRY),A ; STORE NEW RETRY COUNTER - JP NZ,READ_ATAPI_RETRY - LD SP,(PARKSTACK) ; RETURN STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0x0FF ; RETURN ERROR CODE READ ERROR A=FF - RET ; - -READ_HDPART4: - ; STUB - RET - -;___WRITE______________________________________________________________________________________________ -; -; HANDLE CP/M WRITE CALL -; -;________________________________________________________________________________________________________ -WRITE: - DI ; DISABLE INTERRUPTS - LD A,(DISKNO) ; GET DRIVE - CP #1 ; FIND OUT WHICH DRIVE IS BEING REQUESTED - .IF CONDUSEFLOPPY - JP Z,WRITE_FLP_DSK ; - .ELSE - JP Z,WRITE_RAM_DISK ; WRITE TO 448K RAM DISK - .ENDIF - CP #0 ; - JP Z,WRITE_RAM_DISK ; WRITE TO 448K RAM DISK - CP #2 ; - JP Z,WRITE_IDE ; WRITE TO 8 MB IDE HARD DISK, PARTITION 2 - CP #3 ; - .IF CONDUSEATAPI - JP Z,WRITE_ATAPI ; WRITE TO 8 MB IDE HARD DISK, PARTITION 3 - .ELSE - JP Z,WRITE_RAM_DISK ; WRITE TO 448K RAM DISK - .ENDIF - CP #4 ; - JP Z,WRITE_HDPART4 ; WRITE TO 1 MB IDE HARD DISK, PARTITION 4 - - -;___RDONLY______________________________________________________________________________________________ -; -; HANDLE WRITE TO READ ONLY -; -; SENDS A MESSAGE TO TERMINAL THAT ROM DRIVE IS NOT WRITEABLE -; DOES A PAUSE THEN RETURNS TO CPM WITH ERROR FLAGGED THIS IS -; DONE TO ALLOW A POSSIBLE GRACEFUL EXIT (SOME APPS MAY PUKE) -;________________________________________________________________________________________________________ -RDONLY: - LD HL,#TXT_RO_ERROR ; SET HL TO START OF ERROR MESSAGE - CALL PRTMSG ; PRINT ERROR MESSAGE - LD A,#1 ; SEND BAD SECTOR ERROR BACK - ; BDOS WILL ALSO PRINT ITS OWN ERROR MESSAGE - RET - -;___WRITE_RAM_DISK_____________________________________________________________________________________ -; -; WRITE RAM DISK -;________________________________________________________________________________________________________ -WRITE_RAM_DISK: - LD HL,#SECTOR_BUFFER ; LOAD HL WITH TEMP BUF ADDRESS - LD E,L ; - LD D,H ; GET IT INTO DE - LD HL,(DMAAD) ; GET DMA ADDRESS - CALL COPY_CPM_SECTOR ; - CALL SECPAGE ; GET RAM PAGE WRITE ADDRESS - CALL PAGERB ; SET PAGER WITH DRIVE AND TRACK - LD HL,(SECST) ; LOAD HL WITH DMA ADDRESS (WHERE TO WRITE TO) - LD E,L ; - LD D,H ; GET IT INTO DE - LD HL,#SECTOR_BUFFER ; GET TEMP BUFFER ADDRESS - CALL COPY_CPM_SECTOR ; - CALL RPAGE ; SET BACK TO RAM - LD A,(DISKNO) ; STORE CURRENT DRIVE IN BUFFER - LD (CUDISK),A ; - LD A,#0 ; -;;;;; EI ; RE-ENABLE INTERRUPTS - RET - -;___WRITE_FLP_DSK_____________________________________________________________________________________ -; -; WRITE FLOPPY DISK -;________________________________________________________________________________________________________ -WRITE_FLP_DSK: - DI ; DISABLE INTERRUPTS - LD HL,#0 ; - ADD HL,SP ; MOVE STACK POINTER TO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL TRFLSEC ; TRANSLATE SECTOR INFORMATION - CALL READ_FLPY_SEC ; - LD A,(ST1) ; GET STATUS CODE - JP NZ,WRITE_FLP_DSK_OK -WRITE_READ_FLPY_DSK_OK: ; - CALL BLKSEC ; BLOCK SECTOR - ; IDE HD SECTOR IS NOW UPDATED WITH CURRENT CP/M SECTOR DATA SO WRITE TO DISK - LD A,#20 ; 20 RETRIES - LD (RETRY),A ; -WRITE_FLP_DSK_RETRY: ; - CALL FLOPPYWRITE ; WRITE THE FLOPPY DISK SECTOR - LD A,(ST0) ; GET STATUS CODE 0 - AND #0x0F8 ; MASK OF DRIVE AND HEAD SELECTION - LD B,A ; MOVE STATUS CODE 0 TO B - LD A,(ST1) ; GET STATUS CODE 1 - OR B ; IF ZERO WRITE WAS OK - JP Z,WRITE_FLP_DSK_OK ; - LD A,(RETRY) ; BAD WRITE, DEC RETRY COUNTER - DEC A ; - LD (RETRY),A ; STORE NEW RETRY COUNTER - JP NZ,WRITE_FLP_DSK_RETRY ; -WRITE_FLP_DSK_OK: ; - LD SP,(PARKSTACK) ; RESTORE STACK - LD A,(ST1) ; GET STATUS CODE 1 -;;;;; EI ; RE-ENABLE INTERRUPTS - RET - - - -;___WRITE_IDE____________________________________________________________________________________________ -; -; WRITE TO IDE DEVICE -;________________________________________________________________________________________________________ -WRITE_IDE: - DI ; DISABLE INTERRUPTS - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - CALL CONVERT_IDE_SECTOR_CPM ; - CALL IDE_READ_SECTOR ; READ THE IDE HARD DISK SECTOR - JP NC,WRITE_IDE_ERROR ; - CALL BLKSEC ; DEBLOCK SECTOR - CALL IDE_WRITE_SECTOR ; WRITE THE UPDATED IDE HARD DISK SECTOR - LD SP,(PARKSTACK) ; RESTORE STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0 ; RETURN ERROR CODE WRITE SUCCESSFUL A=0 - RET ; -WRITE_IDE_ERROR: ; - LD SP,(PARKSTACK) ; RESTORE STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0x0FF ; RETURN ERROR CODE WRITE ERROR A=FF - RET - -;___WRITE_ATAPI__________________________________________________________________________________________ -; -; WRITE TO ATAPI DEVICE -;________________________________________________________________________________________________________ -WRITE_ATAPI: - LD A,#0x10 ; SET TO SECONDARY DEVICE - LD (IDEDEVICE),A ; - DI ; DISABLE INTERRUPTS - LD HL,#0 ; - ADD HL,SP ; GET STACK POINTER INTO HL - LD (PARKSTACK),HL ; SAVE STACK POINTER - LD SP,#FLOPPYSTACK ; - ; - CALL CONVERT_IDE_SECTOR_CPM ; - ; - CALL ATAPI_READ_SECTOR ; - JP NC,WRITE_ATAPI_ERROR ; - CALL BLKSEC ; DEBLOCK SECTOR - CALL ATAPI_WRITE_SECTOR ; - ; - LD SP,(PARKSTACK) ; RESTORE STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0 ; RETURN ERROR CODE WRITE SUCCESSFUL A=0 - RET ; -WRITE_ATAPI_ERROR: ; - LD SP,(PARKSTACK) ; RESTORE STACK -;;;;; EI ; RE-ENABLE INTERRUPTS - LD A,#0x0FF ; RETURN ERROR CODE WRITE ERROR A=FF - RET ; - -WRITE_HDPART4: - ; STUB - RET - - -;___PRTMSG_______________________________________________________________________________________________ -; -; PRINT MESSAGE POINTED TO BY HL ON CONSOLE DEVICE -;________________________________________________________________________________________________________ -PRTMSG: - LD A,(HL) ; GET CHARACTER TO A - CP #END ; TEST FOR END BYTE - JP Z,PRTMSG1 ; JUMP IF END BYTE IS FOUND - LD C,A ; PUT CHAR TO PRINT VALUE IN REG C FOR CONOUT - CALL CONOUT ; SEND CHARACTER TO CONSOLE FROM REG C - INC HL ; INC POINTER, TO NEXT CHAR - JP PRTMSG ; TRANSMIT LOOP -PRTMSG1: - RET - - -;___SECPAGE_______________________________________________________________________________________________ -; -; UTILITY ROUTINE FOR SECTOR TO PAGE ADDRESS -;________________________________________________________________________________________________________ -SECPAGE: - LD HL,(SECTOR) ; GET SECTOR INTO HL - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*2) - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*4) - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*8) - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*16) - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*32) - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*64) - ADD HL,HL ; SHIFT BITS 1 TO LEFT (*128) - LD (SECST),HL ; SAVE SECTOR STARTING ADDRESS - RET - -;___PAGERB_______________________________________________________________________________________________ -; -; PAGER BYTE CREATION -; ASSEMBLES DRIVE AND TRACK AND SENDS IT TO PAGER PORT -;________________________________________________________________________________________________________ -PAGERB: - LD HL,(TRACK) ; LOAD TRACK INTO HL - LD A,(DISKNO) ; LOAD DISK INTO A - CP #5 ; IS ROM? - JP Z,ROMD ; READ FROM 1M ROM DISK - CP #6 ; IS ROM? - JP Z,ROMD ; READ FROM 22K ROM DISK - AND #1 ; MASK FOR 1 BIT OF DRIVE SELECT - RRCA ; MOVE BIT 0 TO BIT 7 - OR L ; OR L WITH ACC TO COMBINE TRACK AND DRIVE - OUT (MPCL_RAM),A ; SEND TO RAM PORT MAPPER - LD (PAGER),A ; SAVE COPY (JUST BECAUSE) - RET ; -ROMD: ; - LD A,#5 ; - AND #1 ; MASK FOR 1 BIT OF DRIVE SELECT - RRCA ; MOVE BIT 0 TO BIT 7 - OR L ; OR L WITH ACC TO COMBINE TRACK AND DRIVE - AND #0x7F ; STRIP OFF BIT 7 (ROM_ENABLE BIT) - OUT (MPCL_ROM),A ; SEND TO ROM PORT MAPPER - LD (PAGER),A ; SAVE COPY (JUST BECAUSE) - LD (DB_PAGER),A ; SAVE COPY (JUST BECAUSE) (DEBUG) - RET - -;___RPAGE_______________________________________________________________________________________________ -; -; RESET PAGER BACK TO RAM -;________________________________________________________________________________________________________ -RPAGE: - LD A,#0x80 ; DESELECT ROM PAGE - OUT (MPCL_ROM),A ; SELECT RAM - LD A,#0 ; SET TO RAM, TRACK 0 - OUT (MPCL_RAM),A ; SELECT RAM - LD (PAGER),A ; SAVE COPY OF PAGER BYTE - RET - -;___COPY_CPM_SECTOR______________________________________________________________________________________ -; -; COPIES ONE CPM SECTOR FROM ONE MEMORY ADDRESS TO ANOTHER -; INPUT -; DE SOURCE ADDRESS -; HL TARGET ADDRESS -; USES C REGISTER -;________________________________________________________________________________________________________ -COPY_CPM_SECTOR: - LD BC,#128 ; BC IS COUNTER FOR FIXED SIZE TRANSFER (128 BYTES) - LDIR ; TRANSFER - RET - -;___CONVERT_IDE_SECTOR_CPM________________________________________________________________________________ -; -; COMPUTES WHERE THE CP/M SECTOR IS IN THE LBA PARTITION -; LBA HD SECTORS ARE 512 BYTES EACH, CP/M SECTORS ARE 128 BYTES EACH -; MAXIMUM SIZE OF CP/M DISK IS 8 MB = 65536 (16 BITS) X 128 BYTES PER SECTOR -; LBA HD PARTITION CAN HAVE AT MOST 16777215 IDE SECTORS -> 67108860 CP/M SECTORS -; EACH IDE HD SECTOR CONTAINS 4 ADJACENT CP/M SECTORS -; -; -; INPUT: -; - CP/M TRACK AND SECTOR 16 BIT WORDS -; -; OUTPUT: -; IDE TARGET SECTOR (SENT TO IDE HD CONTROLLER FOR READ OPERATION) -; - LOWER 16 BITS STORED IN LBA_TARGET_LO -; - UPPER 16 BITS STORED IN LBA_TARGET_HI -; CP/M TO IDE HD SECTOR MAPPING PARAMETER STORED IN SECTOR_INDEX -; - 8 BIT VALUE WITH 4 LEGAL STATES (00, 01, 02, 04) WHICH IS -; TO BE USED TO COMPUTE STARTING ADDRESS OF 128 BYTE CP/M SECTOR ONCE -; 512 BYTE IDE HD SECTOR READ INTO MEMORY BUFFER -; LBA ADDRESS FORMAT = 00TTTTSS -; -; ROTATE WITH CARRY 16 BIT TRACK,SECTOR VALUE IN HL TO GET 14 BIT IDE HD -; TARGET SECTOR IN PARTITION -; KEEP LAST TWO BITS IN B FOR IDE HD SECTOR TO CP/M SECTOR TRANSLATION -; COMPUTE SECTOR_INDEX -;________________________________________________________________________________________________________ -CONVERT_IDE_SECTOR_CPM: - - LD A,(TRACK) ; LOAD TRACK # (LOW BYTE) - LD H,A ; - LD A,(SECTOR) ; LOAD SECTOR# (LOW BYTE) - LD L,A ; - CALL RRA16 ; ROTATE 'HL' RIGHT (DIVIDE BY 2) - CALL RRA16 ; ROTATE 'HL' RIGHT (DIVIDE BY 2) - LD A,(TRACK+1) ; GET HIGH BYTE OF TRACK INTO A - SLA A ; - SLA A ; - SLA A ; - SLA A ; - SLA A ; - SLA A ; - OR H ; - LD H,A ; - LD A,(TRACK+1) ; GET HIGH BYTE OF TRACK INTO A - SRL A ; - SRL A ; - LD (LBA_TARGET_HI),A ; - LD A,L ; - LD (LBA_TARGET_LO),A ; LBA REGISTER IS 00TTTTSS / 4 - LD A,H ; - LD (LBA_TARGET_LO+1),A ; - LD A,#0 ; - LD (LBA_TARGET_HI+1),A ; - ; - LD HL,(LBA_TARGET_LO) ; STORE PHYSICAL SECTOR - LD (PSECTOR),HL ; - LD HL,(LBA_TARGET_HI) ; STORE PHYSICAL TRACK - LD (PTRACK),HL ; - LD A,(SECTOR) ; LOAD SECTOR # - AND #0b000000011 ; - LD (SECTOR_INDEX),A ; LOCATES WHERE THE 128 BYTE CP/M SECTOR - ; IS WITHIN THE 512 BYTE IDE HD SECTOR - ; COMPUTE WHICH IDE HD SECTOR TO READ TO WITHIN 4 CP/M SECTORS - ; SHIFTS 16 BIT PARTITION OFFSET TO THE RIGHT 2 BITS AND ADDS RESULT TO - ; IDE HD PARTITION STARTING SECTOR - ; SHIFT PARTITION OFFSET RIGHT 1 BIT - RET -RRA16: - SCF ; - CCF ; CLEAR CARRY FLAG - LD A,H ; 16 BIT ROTATE HL WITH CARRY - RRA ; - LD H,A ; ROTATE HL RIGHT 1 BIT (DIVIDE BY 2) - LD A,L ; - RRA ; - LD L,A ; - RET - - -;___IDE_READ_SECTOR______________________________________________________________________________________ -; -; READ IDE SECTOR -;________________________________________________________________________________________________________ -IDE_READ_SECTOR: - CALL ISCUR ; IS CURRENT SECTOR IN BUFFER? - JP Z,IDE_READ_SECTOR_OK ; - CALL IDE_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - CALL IDE_SETUP_LBA ; TELL DRIVE WHAT SECTOR IS REQUIRED - LD A,#0x20 ; - OUT (IDESTTS),A ; 020h = IDE 'READ SECTOR' COMMAND -IDE_SREX: ; - CALL IDE_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - CALL IDE_TEST_ERROR ; ENSURE NO ERROR WAS REPORTED - RET NC ; ERROR, RETURN - CALL IDE_WAIT_BUFFER ; WAIT FOR FULL BUFFER SIGNAL FROM DRIVE - RET NC ; ERROR, RETURN - CALL IDE_READ_BUFFER ; GRAB THE 256 WORDS FROM THE BUFFER - SCF ; CARRY = 1 ON RETURN = OPERATION OK -IDE_READ_SECTOR_OK: ; - LD HL,(PSECTOR) ; STORE PHYSICAL SECTOR IN BUFFER - LD (CUSECTOR),HL ; - LD HL,(PTRACK) ; STORE PHYSICAL DISK TRACK IN BUFFER - LD (CUTRACK),HL ; - LD A,(DISKNO) ; STORE CURRENT DRIVE IN BUFFER - LD (CUDISK),A ; - SCF ; CARRY = 1 ON RETURN = OPERATION OK - RET - -;___IDE_WRITE_SECTOR_____________________________________________________________________________________ -; -; WRITE IDE SECTOR -;________________________________________________________________________________________________________ -IDE_WRITE_SECTOR: - CALL IDE_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - CALL IDE_SETUP_LBA ; TELL DRIVE WHAT SECTOR IS REQUIRED - LD A,#0x30 ; - OUT (IDESTTS),A ; 030h = IDE 'WRITE SECTOR' COMMAND - CALL IDE_WAIT_BUSY_READY ; - RET NC ; ERROR, RETURN - CALL IDE_TEST_ERROR ; ENSURE NO ERROR WAS REPORTED - RET NC ; ERROR, RETURN - CALL IDE_WAIT_BUFFER ; WAIT FOR BUFFER READY SIGNAL FROM DRIVE - RET NC ; ERROR, RETURN - CALL IDE_WRITE_BUFFER ; SEND 256 WORDS TO DRIVE'S BUFFER - CALL IDE_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - CALL IDE_TEST_ERROR ; ENSURE NO ERROR WAS REPORTED - RET NC ; ERROR, RETURN - SCF ; CARRY = 1 ON RETURN = OPERATION OK - RET - -;___IDE_SOFT_RESET_______________________________________________________________________________________ -; -; RESET IDE CHANNEL -;________________________________________________________________________________________________________ -IDE_SOFT_RESET: - .IF CONDIDESOFT ; - LD A,#0b000000110 ; NO INTERRUPTS, RESET DRIVE = 1 - OUT (IDECTRL),A ; - LD A,#0b000000010 ; NO INTERRUPTS, RESET DRIVE = 0 - OUT (IDECTRL),A ; - CALL IDE_WAIT_BUSY_READY ;THIS TAKES A COUPLE OF SECONDS - RET - .ELSE - ; SKIP THIS IF NO IDE DRIVE WHICH SPEEDS UP REBOOTS AND STARTUPS - RET - .ENDIF - -;___ATAPI_WAIT_BUSY_READY________________________________________________________________________________ -; -; WAIT FOR ATAPI CHANNEL TO BE READY -;________________________________________________________________________________________________________ -ATAPI_WAIT_BUSY_READY: - LD DE,#0 ; CLEAR OUT DE -ATAPI_WBSY: ; - LD B,#0x0F0 ; SETUP TIMEOUT -ATAPI_DLP: ; - DJNZ ATAPI_DLP ; - INC DE ; - LD A,D ; - OR E ; - JR Z,ATAPI_TO ; - IN A,(IDESTTS) ; READ ERROR REG - AND #0b010000000 ; MASK OFF BUSY BIT - JR NZ,ATAPI_WBSY ; WE WANT BUSY(7) TO BE 0 - SCF ; CARRY 1 = OK - RET ; -ATAPI_TO: ; - XOR A ; CARRY 0 = TIMED OUT - RET ; - -;___IDE_WAIT_DRQ_READY___________________________________________________________________________________ -; -; WAIT FOR IDE CHANNEL TO BE READY -;________________________________________________________________________________________________________ -IDE_WAIT_DRQ_READY: - IN A,(IDESTTS) ; READ ERROR REG - AND #0b000001000 ; MASK OFF RDY BIT - JR Z,IDE_WAIT_DRQ_READY ; WE WANT DRQ(3) TO BE 1 - RET - -;___IDE_WAIT_DRQ_ZERO____________________________________________________________________________________ -; -; WAIT FOR IDE DRQ TO BE ZERO -;________________________________________________________________________________________________________ -IDE_WAIT_DRQ_ZERO: - IN A,(IDESTTS) ; READ ERROR REG - AND #0b000001000 ; MASK OFF RDY BIT - JR NZ,IDE_WAIT_DRQ_ZERO ; WE WANT DRQ(3) TO BE 0 - RET - -;___IDE_WAIT_BUSY_READY___________________________________________________________________________________ -; -; WAIT FOR IDE CHANNEL TO BE READY -;________________________________________________________________________________________________________ -IDE_WAIT_BUSY_READY: - LD DE,#0 ; CLEAR DE -IDE_WBSY: ; - LD B,#5 ; SETUP TIMEOUT -IDE_DLP: ; - DEC B ; - JP NZ,IDE_DLP ; - INC DE ; - LD A,D ; - OR E ; - JP Z,IDE_TO ; - IN A,(IDESTTS) ; READ ERROR REG - AND #0b011000000 ; MASK OFF BUSY AND RDY BITS - XOR #0b001000000 ; WE WANT BUSY(7) TO BE 0 AND RDY(6) TO BE 1 - JP NZ,IDE_WBSY ; - SCF ; CARRY 1 = OK - RET -IDE_TO: - XOR A ; CARRY 0 = TIMED OUT - RET - -;___IDE_TEST_ERROR_______________________________________________________________________________________ -; -; CHECK FOR IDE ERROR CONDITION -;________________________________________________________________________________________________________ -IDE_TEST_ERROR: - SCF ; - IN A,(IDESTTS) ; - LD B,A ; - AND #0b000000001 ; TEST ERROR BIT - SCF ; - RET Z ; - LD A,B ; - AND #0b000100000 ; - SCF ; - JP NZ,IDE_ERR ; TEST WRITE ERROR BIT - IN A,(IDEERR) ; READ ERROR FLAGS -IDE_ERR: - OR A ; CARRY 0 = ERROR - RET ; IF A = 0, IDE BUSY TIMED OUT - -;___IDE_WAIT_BUFFER_______________________________________________________________________________________ -; -; WAIT FOR DATA BUFFER READY -;________________________________________________________________________________________________________ -IDE_WAIT_BUFFER: - LD DE,#0 ; -IDE_WDRQ: ; - LD B,#5 ; -IDE_BLP: ; - DEC B ; - JP NZ,IDE_BLP ; - INC DE ; - LD A,D ; - OR E ; - JP Z,IDE_TO2 ; - IN A,(IDESTTS) ; WAIT FOR DRIVE'S 512 BYTE READ BUFFER - AND #0b000001000 ; TO FILL (OR READY TO FILL) - JP Z,IDE_WDRQ ; - SCF ; CARRY 1 = OK - RET ; -IDE_TO2: ; - XOR A ; CARRY 0 = TIMED OUT - RET ; - -;___IDE_READ_BUFFER_______________________________________________________________________________________ -; -; READ IDE BUFFER -;________________________________________________________________________________________________________ -IDE_READ_BUFFER: - PUSH HL ; - LD HL,#SECTOR_BUFFER ; - LD B,#0 ; 256 WORDS (512 BYTES PER SECTOR) -IDEBUFRD: ; - IN A,(IDELO) ; LOW BYTE OF WORD FIRST - LD (HL),A ; - IN A,(IDEHI) ; THEN HIGH BYTE OF WORD - INC HL ; - LD (HL),A ; - INC HL ; - DEC B ; - JP NZ,IDEBUFRD ; - POP HL ; - RET - -;___IDE_WRITE_BUFFER_______________________________________________________________________________________ -; -; WRITE TO IDE BUFFER -;________________________________________________________________________________________________________ -IDE_WRITE_BUFFER: - PUSH HL ; - LD HL,#SECTOR_BUFFER ; - LD B,#0 ; 256 WORDS (512 BYTES PER SECTOR) -IDEBUFWT: - INC HL ; - LD A,(HL) ; - DEC HL ; - OUT (IDEHI),A ; SET UP HIGH LATCHED BYTE BEFORE - LD A,(HL) ; - OUT (IDELO),A ; WRITING WORD WITH WRITE TO LOW BYTE - INC HL ; - INC HL ; - DEC B ; - JP NZ,IDEBUFWT ; - POP HL ; - RET - -;___IDE_SETUP_LDA________________________________________________________________________________________ -; -; SETUP IDE DRIVE FOR LDA OPERATION -;________________________________________________________________________________________________________ -IDE_SETUP_LBA: - LD A,(LBA_TARGET_LO) ; LOAD LBA REGISTER 0 WITH SECTOR ADDRESS TO READ - LD (IDE_LBA0),A ; - LD A,(LBA_TARGET_LO+1) ; LOAD LBA REGISTER 1 WITH SECTOR ADDRESS TO READ - LD (IDE_LBA1),A ; - LD A,(LBA_TARGET_HI) ; LOAD LBA REGISTER 2 WITH SECTOR ADDRESS TO READ - LD (IDE_LBA2),A ; - LD A,(LBA_TARGET_HI+1) ; LOAD LBA REGISTER 3 WITH SECTOR ADDRESS TO READ - AND #0b000001111 ; ONLY LOWER FOUR BITS ARE VALID - ADD A,#0b011100000 ; ENABLE LBA BITS 5:7=111 IN IDE_LBA3 - LD (IDE_LBA3),A ; - ; READ IDE HD SECTOR - LD A,#1 ; - OUT (IDESECTC),A ; SET SECTOR COUNT = 1 - ; - LD A,(IDE_LBA0) ; - OUT (IDESECTN),A ; SET LBA 0:7 - ; - LD A,(IDE_LBA1) ; - OUT (IDECYLLO),A ; SET LBA 8:15 - ; - LD A,(IDE_LBA2) ; - OUT (IDECYLHI),A ; SET LBA 16:23 - ; - LD A,(IDE_LBA3) ; - AND #0b000001111 ; LOWEST 4 BITS USED ONLY - OR #0b011100000 ; TO ENABLE LBA MODE - OUT (IDEHEAD),A ; SET LBA 24:27 + BITS 5:7=111 - .IF CONDUSEDSKY - CALL IDESEGDISPLAY ; - .ENDIF - RET - -;___ATAPI_SOFT_RESET_____________________________________________________________________________________ -; -; RESET ATAPI BUS -;________________________________________________________________________________________________________ -ATAPI_SOFT_RESET: - LD A,#0b000001110 ;NO INTERRUPTS, RESET DRIVE = 1 - OUT (IDECTRL),A ; - CALL DELAY24 ; - LD A,#0b000001010 ;NO INTERRUPTS, RESET DRIVE = 0 - OUT (IDECTRL),A ; - CALL ATAPI_WAIT_BUSY_READY ; - RET NC ; ERROR, RETURN - CALL ATAPI_DEVICE_SELECTION ; - CALL DELAY24 ; - CALL REQUEST_SENSE_LOOP ; - RET - -;___REQUEST_SENSE_LOOP____________________________________________________________________________________ -; -; ATAPI_REQUEST SENSE DATA -;_________________________________________________________________________________________________________ -REQUEST_SENSE_LOOP: - LD HL,#ATAPI_REQUEST_SENSE ; - CALL ATAPI_SEND_PACKET ; - CALL ATAPI_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - LD B,#0 ; 256 WORDS (512 BYTES PER SECTOR) -REQUEST_SENSE_LOOP1: ; - IN A,(IDELO) ; - INC IX ; - IN A,(IDEHI) ; - INC IX ; - DJNZ REQUEST_SENSE_LOOP1 ; - RRD ; DELAY ONLY - IN A,(IDESTTS) ;READ ERROR REG - AND #0b000000001 ;MASK OFF BIT - JR NZ,REQUEST_SENSE_LOOP ; - RET - -;___ATAPI_DEVICE_SELECTION________________________________________________________________________________ -; -; ATAPI DEVICE SELECTION -;_________________________________________________________________________________________________________ -ATAPI_DEVICE_SELECTION: - - LD A,(IDEDEVICE) ; SELECTS DEVICE - OR #0x0A0 ; - OUT (IDEHEAD),A ; - RET ; - - - -;__ATAPI_READ_SECTOR_____________________________________________________________________________________________________________ -; READ ATAPI SECTOR -; -; D E H L = SECTOR (DOUBLE WORD) TO READ -;________________________________________________________________________________________________________________________________ -ATAPI_READ_SECTOR: - CALL ISCUR ; - JP Z,ATAPI_READ_DATA_EXIT ; - LD A,(LBA_TARGET_LO) ; LOAD LBA REGISTER 0 WITH SECTOR ADDRESS TO READ - LD (READ_DISK_PACKET+5),A ; - LD A,(LBA_TARGET_LO+1) ; LOAD LBA REGISTER 1 WITH SECTOR ADDRESS TO READ - LD (READ_DISK_PACKET+4),A ; - LD A,(LBA_TARGET_HI) ; LOAD LBA REGISTER 2 WITH SECTOR ADDRESS TO READ - LD (READ_DISK_PACKET+3),A ; - LD A,(LBA_TARGET_HI+1) ; LOAD LBA REGISTER 3 WITH SECTOR ADDRESS TO READ - LD (READ_DISK_PACKET+2),A ; - .IF CONDUSEDSKY - CALL ATAPISEGDISPLAY ; - .ENDIF - CALL REQUEST_SENSE_LOOP ; GET ATAPI SENSE CODES TO CLEAR ERRORS - LD HL,#READ_DISK_PACKET ; SET POINTER TO READ SECTOR PACKET - CALL ATAPI_SEND_PACKET ; SEND PACKET COMMAND - CALL ATAPI_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - LD B,#0 ; 256 WORDS (512 BYTES PER SECTOR) - LD IX,#SECTOR_BUFFER ; - IN A,(IDESTTS) ; READ REG - AND #0b000001000 ; MASK OFF BIT - CP #8 ; IS DATA WAITING? - JR NZ,ATAPI_READ_DATA_EXIT ; NO, EXIT -ATAPI_READ_DATA_LOOP: - IN A,(IDELO) ; - - LD (IX),A ; - - INC IX ; - IN A,(IDEHI) ; - - LD (IX),A ; - - INC IX ; - DJNZ ATAPI_READ_DATA_LOOP ; -ATAPI_READ_DATA_EXIT: ; - LD HL,(PSECTOR) ; STORE PHYSICAL SECTOR IN BUFFER - LD (CUSECTOR),HL ; - LD HL,(PTRACK) ; STORE PHYSICAL DISK TRACK IN BUFFER - LD (CUTRACK),HL ; - LD A,(DISKNO) ; STORE CURRENT DRIVE IN BUFFER - LD (CUDISK),A ; - SCF ; CARRY = 1 ON RETURN = OPERATION OK - RET ; - - - -;__ATAPI_WRITE_SECTOR_____________________________________________________________________________________________________________ -; WRITE ATAPI SECTOR -; -; D E H L = SECTOR (DOUBLE WORD) TO WRITE -;________________________________________________________________________________________________________________________________ -ATAPI_WRITE_SECTOR: - - LD A,(LBA_TARGET_LO) ; LOAD LBA REGISTER 0 WITH SECTOR ADDRESS TO READ - LD (WRITE_DISK_PACKET+5),A ; - LD A,(LBA_TARGET_LO+1) ; LOAD LBA REGISTER 1 WITH SECTOR ADDRESS TO READ - LD (WRITE_DISK_PACKET+4),A ; - LD A,(LBA_TARGET_HI) ; LOAD LBA REGISTER 2 WITH SECTOR ADDRESS TO READ - LD (WRITE_DISK_PACKET+3),A ; - LD A,(LBA_TARGET_HI+1) ; LOAD LBA REGISTER 3 WITH SECTOR ADDRESS TO READ - LD (WRITE_DISK_PACKET+2),A ; - .IF CONDUSEDSKY - CALL ATAPISEGDISPLAY ; - .ENDIF - CALL REQUEST_SENSE_LOOP ; - LD HL,#WRITE_DISK_PACKET ; SET POINTER TO WRITE PACKET COMMAND - CALL ATAPI_SEND_PACKET ; SEND THE PACKET COMMAND - CALL ATAPI_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - LD B,#0 ; 256 WORDS (512 BYTES PER SECTOR) - LD IX,#SECTOR_BUFFER ; -ATAPI_WRITE_DATA_LOOP: - IN A,(IDESTTS) ; READ REG - - LD A,(IX) ; - - PUSH AF ; - INC IX ; - - LD A,(IX) ; - - OUT (IDEHI),A ; - POP AF ; - OUT (IDELO),A ; - INC IX ; - DJNZ ATAPI_WRITE_DATA_LOOP ; - SCF ; CARRY = 1 ON RETURN = OPERATION OK - RET ; - - - - -;__ATAPI_SEND_PACKET_____________________________________________________________________________________________________________ -; SEND PACKET POINTED TO BY HL TO ATAPI DRIVE -; -;________________________________________________________________________________________________________________________________ -ATAPI_SEND_PACKET: - - CALL ATAPI_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - CALL IDE_WAIT_DRQ_ZERO ; - ; - LD A,#0x0A ; - OUT (IDECTRL),A ; DISABLE INT - LD A,#0 ; - OUT (IDEERR),A ; - LD A,#0 ; - OUT (IDESECTC),A ; - LD A,#0 ; - OUT (IDESECTN),A ; - LD A,#0 ; - OUT (IDECYLLO),A ; - LD A,#0x60 ; - OUT (IDECYLHI),A ; - LD A,(IDEDEVICE) ; - OUT (IDEHEAD),A ; BIT 4 SELECTS DEVICE - LD A,#0x0A0 ; - OUT (IDESTTS),A ; - ; - CALL IDE_WAIT_DRQ_READY ; MAKE SURE DRIVE IS READY TO PROCEED - ; - LD B,#6 ; SEND 12 BYTES (6 WORDS) - ; -ATAPI_SEND_PACKET_LOOP: - LD A,(HL) ; GET BYTE - LD D,A ; STORE LOW BYTE IN D - INC HL ; INC POINTER - LD A,(HL) ; GET HIGH BYTE - OUT (IDEHI),A ; STORE HIGH BYTE - LD A,D ; MOVE LOW BYTE INTO A - OUT (IDELO),A ; STORE LOW BYTE - INC HL ; INC POINTER - IN A,(IDECTRL) ; GET STATUS - DJNZ ATAPI_SEND_PACKET_LOOP ; LOOP - ; - CALL ATAPI_WAIT_BUSY_READY ; MAKE SURE DRIVE IS READY TO PROCEED - RET NC ; ERROR, RETURN - IN A,(IDECTRL) ; READ STATUS (FOR DELAY) - ; - RET ; - -;__SETUPDRIVE__________________________________________________________________________________________________________________________ -; -; SETUP FLOPPY DRIVE SETTINGS -;________________________________________________________________________________________________________________________________ -; -SETUPDRIVE: - LD A,#RESETL ; RESET SETTINGS -.IF COND144FLOPPY-1 - OR MINI ; SELECT MINI FLOPPY (LOW DENS=1, HIGH DENS=0) -.ENDIF - OR #PRECOMP ; SELECT PRECOMP - OR #FDDENSITY ; SELECT DENSITY - OR #FDREADY ; SELECT READY SIGNAL - LD (FLATCH_STORE),A ; SAVE SETTINGS - LD A,#1 ; - LD (UNIT),A ; SET UNIT 1 - LD A,#2 ; DENSITY - LD (DENS),A ; - LD A,#9 ; -.IF COND144FLOPPY - ADD A,A -.ENDIF - LD (EOTSEC),A ; LAST SECTOR OF TRACK - LD A,#0x7F ; - LD (SRTHUT),A ; STEP RATE AND HEAD UNLOAD TIME - LD A,#5 ; - LD (HLT),A ; HEAD LOAD TIME - LD A,#0x0D ; - LD (GAP),A ; GAP -;; LD A,#0x80 ; -;; LD (SECSIZ),A ; SECTOR SIZE /4 - ; - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - ; - LD HL,#FLATCH_STORE ; POINT TO FLATCH - RES 1,(HL) ; SET MOTOR ON - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - NOP ; - NOP ; - LD A,#0 ; ZERO TRACK - LD (PTRACK),A ; STORE TRACK - CALL SETTRACK ; DO IT - NOP ; - NOP ; - LD HL,#FLATCH_STORE ; POINT TO FLATCH - SET 1,(HL) ; SET MOTOR OFF - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - RET -; -;__OUTFLATCH__________________________________________________________________________________________________________________________ -; -; SEND SETTINGS TO FLOPPY CONTROLLER -;________________________________________________________________________________________________________________________________ -; -OUTFLATCH: - LD A,(FLATCH_STORE) ; SET A TO SETTINGS - OUT (FLATCH),A ; OUTPUT TO CONTROLLER - RET - -;__FLOPPYREAD__________________________________________________________________________________________________________________________ -; -; READ A FLOPPY DISK SECTOR -;________________________________________________________________________________________________________________________________ -; -FLOPPYREAD: - .IF CONDUSEDSKY - CALL SEGDISPLAY ; - .ENDIF - LD A,#0x46 ; BIT 6 SETS MFM, 06H IS READ COMMAND - LD (CMD),A ; - JP DSKOP ; -; -;__FLOPPYWRITE__________________________________________________________________________________________________________________________ -; -; WRITE A FLOPPY DISK SECTOR -;________________________________________________________________________________________________________________________________ -; -FLOPPYWRITE: - .IF CONDUSEDSKY - CALL SEGDISPLAY ; - .ENDIF - LD A,#0x45 ; BIT 6 SETS MFM, 05H IS WRITE COMMAND - LD (CMD),A ; - JP DSKOP ; -; -;__DSKOP__________________________________________________________________________________________________________________________ -; -; PERFORM A DISK OPERATION -;________________________________________________________________________________________________________________________________ -; -DSKOP: - LD HL,#FLATCH_STORE ; POINT TO FLATCH - SET 1,(HL) ; SET MOTOR OFF - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - ; - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CP #0x0FF ; DID IT RETURN WITH ERROR CODE? - JP Z,DSKEXIT ; IF YES, EXIT WITH ERROR CODE - ; - LD A,(UNIT) ; GET DISK UNIT NUMBER - AND #3 ; MASK FOR FOUR DRIVES - LD B,A ; PARK IT IN B - LD A,(HEAD) ; GET HEAD SELECTION - AND #1 ; INSURE SINGLE BIT - RLA ; - RLA ; MOVE HEAD TO BIT 2 POSITION - OR B ; OR HEAD TO UNIT BYTE IN COMMAND BLOCK - LD (UNIT),A ; STORE IN UNIT - ; - LD HL,#FLATCH_STORE ; POINT TO FLATCH - RES 1,(HL) ; SET MOTOR ON - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - ; - LD A,#3 ; SPECIFY COMMAND - CALL PFDATA ; PUSH IT - LD A,(SRTHUT) ; STEP RATE AND HEAD UNLOAD TIME - CALL PFDATA ; PUSH THAT - LD A,(HLT) ; - CALL PFDATA ; PUSH THAT - ; - CALL SETTRACK ; PERFORM SEEK TO TRACK - ; - JP NZ,DSKEXIT ; IF ERROR, EXIT - ; - LD A,(CMD) ; WHAT COMMAND IS PENDING? - OR A ; SET FLAGS - JP DOSO4 ; NO, MUST BE READ OR WRITE COMMAND -DSKEXIT: - LD HL,#FLATCH_STORE ; POINT TO FLATCH - SET 1,(HL) ; SET MOTOR OFF - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - ; - OR #0x0FF ; SET -1 IF ERROR - RET - -RESULT: - LD C,#7 ; LOAD C WITH NUMBER OF STATUS BYTES - LD HL,#ST0 ; POINT TO STATS STORAGE -RS3: - CALL GFDATA ; GET FIRST BYTE - LD (HL),A ; SAVE IT - INC HL ; POINTER++ - DEC C ; CC-1 - JP NZ,RS3 ; LOOP TIL C0 - LD A,(ST0) ; LOAD STS0 - AND #0x0F8 ; MASK OFF DRIVE # - LD B,A ; PARK IT - LD A,(ST1) ; LOAD STS1 - OR B ; ACC OR B ->ACC IF 0 THEN SUCCESS - ; -RSTEXIT: - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - LD HL,#FLATCH_STORE ; POINT TO FLATCH - SET 1,(HL) ; SET MOTOR OFF - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - ; - .IF CONDUSEDSKY - CALL SEGDISPLAY ; - .ENDIF - RET ; DONE RETURN TO CALLER - - -DOSO4: - ; -.IF 1 ; -INT_LOC = 0x038 ; IM 1 INTERRUPT CALLS GO HERE -; SET UP FOR I/O AT INTERRUPT LEVEL - LD DE,#INT_LOC - LD HL,#INT_RD - LD BC,#L_INT_RD - LD A,(CMD) ; - AND #0b000000001 ; WRITE IS 1 - JP Z,IS_READ - ADD HL,BC -IS_READ: - LDIR -.ENDIF - - LD HL,#SECTOR_BUFFER ; GET BUFFER ADDRESS TO HL -;; LD A,(SECSIZ) ; XFERLEN -;; LD C,A ; C WILL BE THE NUMBER OF TRANSACTIONS - ; DIVIDED BY 4 - - ld de,(FSECSIZ) ; GET FULL SECTOR SIZE - LD B,E - LD C,#FDATA ; GET DATA REGISTER I/O ADDRESS - - LD A,(CMD) ; - CALL PFDATA ; PUSH COMMAND TO I8272 - LD A,(UNIT) ; - CALL PFDATA ; - LD A,(PTRACK) ; - CALL PFDATA ; - LD A,(HEAD) ; - CALL PFDATA ; - LD A,(PSECTOR) ; - INC A ; - CALL PFDATA ; - LD A,(DENS) ; - CALL PFDATA ; WHAT DENSITY - LD A,(EOTSEC) ; - CALL PFDATA ; ASSUME SC (SECTOR COUNT) EOT - LD A,(GAP) ; - CALL PFDATA ; WHAT GAP IS NEEDED - LD A,(DTL) ; DTL, IS THE LAST COMMAND BYTE TO I8272 - CALL PFDATAS ; -; -; -; PERFORM READ / WRITE -; - - -RDD_POLL: - -FDC_RW_P0: - EI - HALT - JP NZ,FDC_RW_P0 ;10 COUNT THRU 256 BYTES -FDC_RW_P1: - EI - HALT - JP NZ,FDC_RW_P1 ;10 COUNT THRU 256 BYTES - - -; FALL THROUGH WITH INTERRUPTS DISABLED (NOT ENABLED IN INTERRUPT SERVICE) - - -DSKOPEND: - LD HL,#FLATCH_STORE ; POINT TO FLATCH - SET 0,(HL) ; SET TC - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - NOP ; - NOP ; 2 MICROSECOND DELAY - RES 0,(HL) ; RESET TC - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - NOP ; - NOP ; 2 MICROSECOND DELAY - NOP ; - NOP ; 2 MICROSECOND DELAY - SET 1,(HL) ; TURN OFF MOTOR - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - JP RESULT ; GET STATUS BYTES - - - -INT_RD: INI - RET -IRTEMP: -L_INT_RD = IRTEMP - INT_RD - -INT_WR: OUTI - RET -IWTEMP: -L_INT_WR = IWTEMP - INT_WR - - - -;__SETTRACK__________________________________________________________________________________________________________________________ -; -; SEEK TO A TRACK ON GIVEN UNIT -; A: TRACK # -;________________________________________________________________________________________________________________________________ -; -SETTRACK: - LD A,(FTRACK) ; GET CURRENT HEAD TRACK - LD C,A - LD A,(PTRACK) ; GET TRACK - OR A ; SET FLAGS - JP Z,RECAL ; IF 0 PERFORM RECAL INSTEAD OF SEEK - CP C ; - JP Z,WAINT ; ALREADY THERE, ABORT - LD (FTRACK),A ; STORE TRACK - LD A,#0x0F ; SEEK COMMAND - CALL PFDATA ; PUSH COMMAND - LD A,(UNIT) ; SAY WHICH UNIT - CALL PFDATA ; SEND THAT - LD A,(PTRACK) ; TO WHAT TRACK - CALL PFDATA ; SEND THAT TOO - JP WAINT ; WAIT FOR INTERRUPT SAYING DONE -RECAL: - LD A,#0 ; - LD (FTRACK),A ; STORE TRACK - LD A,#7 ; RECAL TO TRACK 0 - CALL PFDATA ; SEND IT - LD A,(UNIT) ; WHICH UNIT - CALL PFDATA ; SEND THAT TOO - ; -WAINT: - ; - CALL DELAYHSEC ; DELAY TO LET HEADS SETTLE BEFORE READ - ; - ; WAIT HERE FOR INTERRPT SAYING DONE - ; LOOP TIL INTERRUPT - CALL CHECKINT ; CHECK INTERRUPT STATUS - ; - RET - -;__CYCLEFLOPPY__________________________________________________________________________________________________________________________ -; -; SEEK TO TRACK 0, THEN BACK TO THE SELECTED TRACK -; THIS CAN BE USED ON AN ERROR CONDITION TO VERIFY THAT HEAD IS ON SELECTED TRACK -; -;________________________________________________________________________________________________________________________________ -; -CYCLEFLOPPY: - PUSH AF ; STORE AF - PUSH HL ; STORE HL - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - CALL CHECKINT ; CHECK INTERRUPT STATUS, MAKE SURE IT IS CLEAR - LD HL,#FLATCH_STORE ; POINT TO FLATCH - RES 1,(HL) ; SET MOTOR ON - CALL OUTFLATCH ; OUTPUT TO CONTROLLER - NOP ; - NOP ; - CALL RECAL ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL RECAL ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL SETTRACK ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - CALL DELAYHSEC ; - POP HL ; - POP AF ; RESTORE AF - RET - -;__PFDATAS__________________________________________________________________________________________________________________________ -; -; WRITE A COMMAND OR PARAMETER SEQUENCE -; -; TRANSFERS ARE SYNCHONIZED BYT MSR D7 AND D6 -; RQM DIO -; 0 0 BUSY -; 1 0 WRITE TO DATA REGISTER PERMITTED -; 1 1 BYTE FOR READ BY HOST PENDING -; 0 1 BUSY -; -;________________________________________________________________________________________________________________________________ -; -PFDATAS: - PUSH AF ; STORE AF -PFDS1: - IN A,(FMSR) ; READING OR WRITING IS KEYS TO D7 RQM - AND #0x80 ; MASK OFF RQM BIT - JP Z,PFDS1 ; WAIT FOR RQM TO BE TRUE - IN A,(FMSR) ; READ STATUS - AND #0x40 ; WAITING FOR INPUT? - CALL NZ,ERRORT ; NO, SIGNAL ERROR - POP AF ; RESTORE AF - OUT (FDATA),A ; OUTPUT A TO CONTROLLER - RET - -;__PFDATA__________________________________________________________________________________________________________________________ -; -; WRITE A COMMAND OR PARAMETER SEQUENCE -; -; TRANSFERS ARE SYNCHONIZED BYT MSR D7 AND D6 -; RQM DIO -; 0 0 BUSY -; 1 0 WRITE TO DATA REGISTER PERMITTED -; 1 1 BYTE FOR READ BY HOST PENDING -; 0 1 BUSY -; -;________________________________________________________________________________________________________________________________ -; -PFDATA: - PUSH AF ; STORE AF -PFD1: - IN A,(FMSR) ; READING OR WRITING IS KEYS TO D7 RQM - AND #0x80 ; MASK OFF RQM BIT - JP Z,PFD1 ; WAIT FOR RQM TO BE TRUE - IN A,(FMSR) ; READ STATUS - AND #0x40 ; WAITING FOR INPUT? - CALL NZ,ERRORT ; NO, SIGNAL ERROR - POP AF ; RESTORE AF - OUT (FDATA),A ; OUTPUT A TO CONTROLLER - JP DELAY24 ; DELAY 24US - - - -;__DELAY24__________________________________________________________________________________________________________________________ -; -; DELAY 24US -;________________________________________________________________________________________________________________________________ -; -DELAY24: - ; JP= 10T - PUSH IX ; 15T - POP IX ; 14T - PUSH IX ; 15T - POP IX ; 14T -DELAY12: - PUSH IX ; 15T - POP IX ; 14T - RET ; 10T - - -;__CHECKINT__________________________________________________________________________________________________________________________ -; -; CHECK FOR ACTIVE FDC INTERRUPTS BEFORE GIVING I8272 COMMANDS -; POLL RQM FOR WHEN NOT BUSY AND THEN SEND FDC -; SENSE INTERRUPT COMMAND IF IT RETURNS WITH NON ZERO -; ERROR CODE, PASS BACK TO CALLING ROUTINE FOR HANDLING -;________________________________________________________________________________________________________________________________ -; -CHECKINT: - IN A,(FMSR) ; READING OR WRITING IS KEYS TO D7 RQM - AND #0x80 ; MASK OFF RQM BIT - JP Z,CHECKINT ; WAIT FOR RQM TO BE TRUE WAIT UNTIL DONE - IN A,(FMSR) ; READ STATUS - AND #0x40 ; WAITING FOR INPUT? - JP NZ,CHECKINTDONE ; NO, SIGNAL ERROR - CALL SENDINT ; SENSE INTERRUPT COMMAND -CHECKINTDONE: - RET ; - - -;__DELAYHSEC__________________________________________________________________________________________________________________________ -; -; DELAY FOR 1/2 SECOND -;________________________________________________________________________________________________________________________________ -; -DELAYHSEC: - LD HL,#0 ; 65536 -DELDM: - NOP ; (4 T) - NOP ; (4 T) - NOP ; (4 T) - NOP ; (4 T) - DEC L ; (6 T) - JP NZ,DELDM ; (10 T) 24 T 8 MICROSECONDS AT 4 MHZ - DEC H ; (6 T) - JP NZ,DELDM ; (10 T) (8 US * 256) * 256 524288 US 5 SECONDS - RET - -;__ERRORT__________________________________________________________________________________________________________________________ -; -; ERROR HANDLING -;________________________________________________________________________________________________________________________________ -; -ERRORT: - IN A,(FDATA) ; CLEAR THE JUNK OUT OF DATA REGISTER - IN A,(FMSR) ; CHECK WITH RQM - AND #0x80 ; IF STILL NOT READY, READ OUT MORE JUNK - JP Z,ERRORT ; - LD A,#0x0FF ; RETURN ERROR CODE -1 - ; - RET - -;__SENDINT__________________________________________________________________________________________________________________________ -; -; SENSE INTERRUPT COMMAND -;________________________________________________________________________________________________________________________________ -; -SENDINT: - LD A,#8 ; SENSE INTERRUPT COMMAND - CALL PFDATA ; SEND IT - CALL GFDATA ; GET RESULTS - LD (ST0A),A ; STORE THAT - AND #0x0C0 ; MASK OFF INTERRUPT STATUS BITS - CP #0x80 ; CHECK IF INVALID COMMAND - JP Z,ENDSENDINT ; YES, EXIT - CALL GFDATA ; GET ANOTHER (STATUS CODE 1) - LD (ST1A),A ; SAVE THAT - LD A,(ST0A) ; GET FIRST ONE - AND #0x0C0 ; MASK OFF ALL BUT INTERRUPT CODE 00 IS NORMAL -ENDSENDINT: - RET ; ANYTHING ELSE IS AN ERROR - - -;__GFDATA__________________________________________________________________________________________________________________________ -; -; GET DATA FROM FLOPPY CONTROLLER -; -; TRANSFERS ARE SYNCHONIZED BYT MSR D7 AND D6 -; RQM DIO -; 0 0 BUSY -; 1 0 WRITE TO DATA REGISTER PERMITTED -; 1 1 BYTE FOR READ BY HOST PENDING -; 0 1 BUSY -; -;________________________________________________________________________________________________________________________________ -; -GFDATA: - IN A,(FMSR) ; READ STATUS BYTE - AND #0x80 ; MASK OFF RQM - JP Z,GFDATA ; LOOP WHILE BUSY - IN A,(FMSR) ; READ STSTUS BUTE - AND #0x40 ; MASK OFF DIO - CALL Z,ERRORT ; IF WRITE EXPECTED RUN ERRORRT - IN A,(FDATA) ; READ DATA - JP DELAY24 ; DELAY 24US - - - - .IF CONDUSEDSKY -;__IDESEGDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF IDE LOGICAL BLOCK ADDRESS ON DSKY -;____________________________________________________________________________________________________ -IDESEGDISPLAY: - LD A, #0x82 ; - OUT (PIOCONT),A ; - ; - LD A,(IDE_LBA3) ; - AND #0x0F ; - LD (DISPLAYBUF+6),A ; - LD A,(IDE_LBA3) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+7),A ; - ; - LD A,(IDE_LBA2) ; - AND #0x0F ; - LD (DISPLAYBUF+4),A ; - LD A,(IDE_LBA2) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; - ; - LD A,(IDE_LBA1) ; - AND #0x0F ; - LD (DISPLAYBUF+2),A ; - LD A,(IDE_LBA1) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+3),A ; - - LD A,(IDE_LBA0) ; - AND #0x0F ; - LD (DISPLAYBUF),A ; - LD A,(IDE_LBA0) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+1),A ; - JP SEGDISPLAY1 ; - -;__ATAPISEGDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF ATAPI LOGICAL BLOCK ADDRESS ON DSKY -;____________________________________________________________________________________________________ -ATAPISEGDISPLAY: - LD A, #0x82 ; - OUT (PIOCONT),A ; - ; - LD A,(LBA_TARGET_HI+1) ; - AND #0x0F ; - LD (DISPLAYBUF+6),A ; - LD A,(LBA_TARGET_HI+1) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+7),A ; - ; - LD A,(LBA_TARGET_HI) ; - AND #0x0F ; - LD (DISPLAYBUF+4),A ; - LD A,(LBA_TARGET_HI) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; - ; - LD A,(LBA_TARGET_LO+1) ; - AND #0x0F ; - LD (DISPLAYBUF+2),A ; - LD A,(LBA_TARGET_LO+1) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+3),A ; - ; - LD A,(LBA_TARGET_LO) ; - AND #0x0F ; - LD (DISPLAYBUF),A ; - LD A,(LBA_TARGET_LO) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+1),A ; - JP SEGDISPLAY1 ; - -;__SEGDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF TRACK, SECTOR, ST0, ST1 ON DSKY -; -;____________________________________________________________________________________________________ -SEGDISPLAY: - LD A, #0x82 ; - OUT (PIOCONT),A ; - LD A,(TRACK) ; - AND #0x0F ; - LD (DISPLAYBUF+6),A ; - LD A,(TRACK) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+7),A ; - LD A,(SECTOR) ; - AND #0x0F ; - LD (DISPLAYBUF+4),A ; - LD A,(SECTOR) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; - LD A,(ST0) ; - AND #0x0F ; - LD (DISPLAYBUF+2),A ; - LD A,(ST0) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+3),A ; - LD A,(ST1) ; - AND #0x0F ; - LD (DISPLAYBUF),A ; - LD A,(ST1) ; - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+1),A ; -SEGDISPLAY1: ; - LD HL,#DISPLAYBUF ; - LD BC,#7 ; - ADD HL,BC ; - LD B,#8 ; SET DIGIT COUNT - LD A,#0x40 ; SET CONTROL PORT 7218 TO OFF - OUT (PORTC),A ; OUTPUT - CALL DELAY12 ; WAIT - LD A,#0x0D0 ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE, DECODE, NORMAL) - OUT (PORTA),A ; OUTPUT TO PORT - LD A,#0x80 ; STROBE WRITE PULSE WITH CONTROL=1 - OUT (PORTC),A ; OUTPUT TO PORT - CALL DELAY12 ; WAIT - LD A,#0x40 ; SET CONTROL PORT 7218 TO OFF - OUT (PORTC),A ; OUTPUT - CALL DELAY12 ; WAIT -SEGDISPLAY_LP: - LD A,(HL) ; GET DISPLAY DIGIT - OUT (PORTA),A ; OUT TO PORTA - LD A,#0 ; SET WRITE STROBE - OUT (PORTC),A ; OUT TO PORTC - CALL DELAY12 ; DELAY - LD A,#0x40 ; SET CONTROL PORT OFF - OUT (PORTC),A ; OUT TO PORTC - CALL DELAY12 ; WAIT - DEC HL ; INC POINTER - DJNZ SEGDISPLAY_LP ; LOOP FOR NEXT DIGIT - RET - -DISPLAYBUF: .DB 01,02,03,04,05,06,07,08 - .ENDIF - .DB 00,00,00,00,00,00,00,00 - .DB 00,00,00,00,00,00,00,00 - .DB 00,00,00,00,00,00,00,00 - .DB 00,00,00,00,00,00,00,00 - - - -FLOPPYSTACK: .DB 00 -PARKSTACK: .DB 00,00,00,00 - -READ_DISK_PACKET: - .DB 0x0A8,00,00,00,00,01,00,00,00,01,00,00 -WRITE_DISK_PACKET: - .DB 0x2A,00,00,00,00,0x11,00,00,01,00,00,00 -ATAPI_REQUEST_SENSE: - .DB 3,00,00,00,0x11,00,00,00,00,00,00,00 - -; ******* TEXT STRINGS ******* - -TXT_RO_ERROR: - .DB CR,LF - .ascii "ERROR: WRITE TO READ ONLY DISK" - .DB END - - -TXT_STARTUP_MSG: - - .IF CONDSHORTMSG - .DB CR,LF - .ascii "CP/M-80 2.2C (JC0705-1) for " - .ascii "N8VEM - W/" - .IF CONDUSEVDU - .ascii "VDU " - .ENDIF - .IF CONDUSEDSKY - .ascii "DSKY " - .ENDIF - .IF CONDIDESOFT - .ascii "IDE " - .ENDIF - .IF CONDUSEATAPI - .ascii "ATAPI " - .ENDIF - .IF CONDUSEFLOPPY - .ascii "FLOPPY " - .IF COND144FLOPPY - .ascii "1.44M " - .ENDIF - .ENDIF - .DB CR,LF - .DB END - .ELSE - .ascii "CP/M V2.2C" - .DB END - .ENDIF - -; -; THE REMAINDER OF THE CBIOS IS RESERVED UNINITIALIZED -; DATA AREA, AND DOES NOT NEED TO BE A PART OF THE -; SYSTEM MEMORY IMAGE (THE SPACE MUST BE AVAILABLE, -; HOWEVER, BETWEEN "BEGDAT" AND "ENDDAT") -; - -; -; DISK COMMAND BLOCK -; -CMD: .DB 0 ; COMMAND READ OR WRITE, -UNIT: .DB 0 ; PHYSICAL DRIVE 0->3 -HEAD: .DB 0 ; HEAD SEL 0 OR 1 -DENS: .DB 2 ; DENSITY -EOTSEC: .DB 09 ; LAST SECTOR OF TRACK -GAP: .DB 0x1B ; VALUE FOR IRG -;SECSIZ: .DB 0x80 ; HOW MANY BYTES TO TRANSFER/4 -FSECSIZ: .dw 0x0200 ; actual sector size in bytes -DTL: .DB 0x0FF ; SIZE OF SECTOR -SRTHUT: .DB 0x7F ; STEP RATE AND HEAD UNLOAD TIME -HLT: .DB 5 ; HEAD LOAD TIME -MIN: .DB MINI ; LATCH BIT PATTERN FOR FDC9229 MINITRUE -PRE: .DB PRECOMP ; LATCH BIT PATTERN FOR FDC9229 PRECOMP125NS -; -; FLOPPY STATUS RESULT STORAGE -; -ST0: .DB 0 ; STORE STATUS 0 -ST1: .DB 0 ; ST1 -ST2: .DB 0 ; ST2 -SCYL: .DB 0 ; TRACK -SHEAD: .DB 0 ; HEAD 0 OR 1 -SREC: .DB 0 ; SECTOR -SNBIT: .DB 0 ; DENSITY -ST0A: .DB 0 ; STORE STATUS 0 -ST1A: .DB 0 ; ST1 -RETRY: .DB 0 ; RETRIES -RETRY1: .DB 0 ; RETRIES - -FLATCH_STORE: .DB 00 ; - -TRACK: .DW 0 ; TWO BYTES FOR TRACK # (LOGICAL) -PTRACK: .DW 0 ; TWO BYTES FOR TRACK # (PHYSICAL) -FTRACK: .DW 0 ; TWO BYTES FOR TRACK # (HEAD LOCATION) - -PAGER: .DB 1 ; COPY OF PAGER BYTE -DB_PAGER: .DB 0x0FF ; COPY OF PAGER BYTE (DEBUG) -SECTOR: .DW 0 ; TWO BYTES FOR SECTOR # (LOGICAL) -PSECTOR: .DW 0 ; TWO BYTES FOR SECTOR # (PHYSICAL) -SECST: .DW 0 ; SECTOR IN ROM/RAM START ADDRESS -DMAAD: .DW 0 ; DIRECT MEMORY ADDRESS -DISKNO: .DB 0 ; DISK NUMBER 0-15 -LBA_TARGET_LO: .DW 0 ; IDE HD PARTITION TARGET SECTOR (LOW 16 BITS) -LBA_TARGET_HI: .DW 0 ; IDE HD PARTITION TARGET SECTOR (HI 16 BITS, 12 USED) -IDEDEVICE: .DB 0 ; ATAPI DEVICE SELECTION FLAG - -IDE_LBA0: .DB 0 ; SET LBA 0:7 -IDE_LBA1: .DB 0 ; SET LBA 8:15 -IDE_LBA2: .DB 0 ; SET LBA 16:23 -IDE_LBA3: .DB 0 ; LOWEST 4 BITS USED ONLY TO ENABLE LBA MODE -SECTOR_INDEX: .DB 1 ; WHERE 128 BYTE CP/M SECTOR IS IN 512 BYTE IDE HD SECTOR -; -; SCRATCH RAM AREA FOR BDOS USE -BEGDAT: -; = $ ; BEGINNING OF DATA AREA -DIRBF: .DS 128 ; SCRATCH DIRECTORY AREA -ALL00: .DS 65 ; ALLOCATION VECTOR 0 (DSM/8 = 1 BIT PER BLOCK) 44 -ALL01: .DS 33 ; ALLOCATION VECTOR 1 (225/8) -ALL02: .DS 256 ; ALLOCATION VECTOR 2 (511/8) -ALL03: .DS 256 ; ALLOCATION VECTOR 3 (511/8) -ALL04: .DS 65 ; ALLOCATION VECTOR 4 (497/8) -ALL05: .DS 65 ; ALLOCATION VECTOR 4 (495/8) -ALL06: .DS 65 ; ALLOCATION VECTOR 4 (495/8) -ALL07: .DS 135 ; ALLOCATION VECTOR 7 (495/8) -CHK00: .DS 5 ; 720K MEDIA -CHK01: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK02: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK03: .DS 128 ; 8M MEDIA -CHK04: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK05: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK06: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK07: .DS 15 ; 1.44M MEDIA -; -CUDISK: .DS 1 ; CURRENT PHYSICAL DISK ID IN BUFFER -CUSECTOR: .DW 1 ; CURRENT PHYSICAL DISK SECTOR IN BUFFER -CUTRACK: .DW 2 ; CURRENT PHYSICAL DISK TRACK IN BUFFER -SECTOR_BUFFER: .DS 520 ; STORAGE FOR 512 BYTE IDE HD SECTOR -ENDDAT: -; .EQU $ ; END OF DATA AREA -DSTEMP: -DATSIZ = DSTEMP - BEGDAT ; SIZE OF DATA AREA - - -;dwg; .ORG 0FDFFH -LASTBYTE: .DB 0 - -; .END - - - - - -_cbios_end:: - .area _CODE - .area _CABS diff --git a/branches/dgg/cpurom/src/cbiosn8.s b/branches/dgg/cpurom/src/cbiosn8.s deleted file mode 100644 index 709f9826..00000000 --- a/branches/dgg/cpurom/src/cbiosn8.s +++ /dev/null @@ -1,1708 +0,0 @@ -;-------------------------------------------------------- -; cbioshc.s derived from CPM22-HC.ASM by dwg 5/18-30/2011 -;-------------------------------------------------------- - .module cbioshc - .optsdcc -mz80 -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - .globl _cbioshc -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - .area _DATA -;-------------------------------------------------------- -; overlayable items in ram -;-------------------------------------------------------- - .area _OVERLAY -;-------------------------------------------------------- -; external initialized ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - .area _HOME - .area _GSINIT - .area _GSFINAL - .area _GSINIT -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - .area _HOME - .area _HOME -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - .area _CBIOS -_cbioshc_start:: -_cbioshc: - -;************************************************************** -;* -;* C B I O S f o r -;* -;* T e s t P r o t o t y p e -;* -;* by Andrew Lynch, with input from many sources -;* Updated 24-Mar-2009 Max Scane - changed seldsk: to not save bogus drive value -;* changed a: to be ram drive, B: to be rom disk -;* Updated 1-Jun-2010 Max Scane - Changed DPBs to be more sane -;* Updated 1-Jul-2010 Max Scane - Added PPIDE driver and conditionals -;* Updated April 2011 Max Scane - Adapted for the N8VEM Home Computer -;************************************************************** -; -; SKELETAL CBIOS FOR FIRST LEVEL OF CP/M 2.0 ALTERATION -; WITH MODS FOR CP/M ROMDISK AND RAMDISK. -; -; ENTIRELY IN 8080 MNEUMONICS (SO ASM CAN BE USED) -; BUT ASSUMES A Z80! (remove) -; - -MEM = 60 ; DOUGTEMP DOUGTEMP - - -;MSIZE .EQU 20 ;CP/M VERSION MEMORY SIZE IN KILOBYTES -;MSIZE .EQU 62 ;CP/M VERSION MEMORY SIZE IN KILOBYTES -; MEM defined in CPM22 above, line 0015 - -MSIZE = MEM ;CP/M VERSION MEMORY SIZE IN KILOBYTES - -; -; "BIAS" IS ADDRESS OFFSET FROM 3400H FOR MEMORY SYSTEMS -; THAN 16K (REFERRED TO AS "B" THROUGHOUT THE TEXT). -; - -BIAS = (MSIZE-20)*1024 - -CCP = 0x3400+BIAS ; base of ccp - -BDOS = CCP+0x0806 ; base of BDOS - -BIOS = CCP+0x1600 ; base of BIOS - -CDISK = 0x0004 ; current disk number 0=a,...,15=p - -; IOBYTE already defined in CPM22 above, line 0017 -;IOBYTE .EQU 0003H ;INTEL I/O BYTE - -; since the assembly has been broken into pieces, -; this symbols wasn't previously encountered. -; It could be exported from other module, but why? -IOBYTE = 0x0003 - -; -; CONSTANTS - - -END = 0x0FF - - -CR = 0x0d -LF = 0x0a - -DEFIOB = 0x94 ; default IOBYTE (TTY,RDR,PUN,LPT) - -; - -ROMSTART_MON = 0x0100 ; where the monitor is stored in ROM - -RAMTARG_MON = 0x0f800 ; where the monitor starts in RAM - -MOVSIZ_MON = 0x0800 ; monitor is 2K in length - -ROMSTART_CPM = 0x0900 ; where ccp+bdos+bios is stored in ROM - -RAMTARG_CPM = 0x0D400 ; where ccp+bdos+bios starts in RAM - -;dwg; INTERESTING - 0x15FF is 4K+1K+512-1, not 5KB -;dwg;MOVSIZ_CPM: .EQU $15FF ; CCP, BDOS IS 5KB IN LENGTH -MOVSIZ_CPM = 0x15FF ; ccp+bdos is 5KB in length - -HC_REG_BASE = 0x80 ; N8 I/I Regs $80-9F - -PPI1 = HC_REG_BASE+0x00 - -ACR = HC_REG_BASE+0x14 - -RMAP = ACR+2 - -IO_REG_BASE = 0x40 ; IO reg base offset for Z1x80 - -CNTLA0 = IO_REG_BASE+0x00 - -CNTLB0 = IO_REG_BASE+0x02 - -STAT0 = IO_REG_BASE+0x04 - -TDR0 = IO_REG_BASE+0x06 - -RDR0 = IO_REG_BASE+0x08 - -ASEXT0 = IO_REG_BASE+0x12 - -CBR = IO_REG_BASE+0x38 - -BBR = IO_REG_BASE+0x39 - -CBAR = IO_REG_BASE+0x3A - -; -; -; PIO 82C55 I/O IS ATTACHED TO THE FIRST IO BASE ADDRESS - -IDELSB = PPI1+0 ; LSB - -IDEMSB = PPI1+1 ; MSB - -IDECTL = PPI1+2 ; Control Signals - -PIO1CONT = PPI1+3 ; Control Byte PIO 82C55 - -; PPI control bytes for read and write to IDE drive - -rd_ide_8255 = 0b10010010 ; ide_8255_ctl out ide_8255_lsb/msb input - -wr_ide_8255 = 0b10000000 ; all three ports output - -;ide control lines for use with ide_8255_ctl. Change these 8 -;constants to reflect where each signal of the 8255 each of the -;ide control signals is connected. All the control signals must -;be on the same port, but these 8 lines let you connect them to -;whichever pins on that port. - -ide_a0_line = 0x01 ; direct from 8255 to ide interface - -ide_a1_line = 0x02 ; direct from 8255 to ide intereface - -ide_a2_line = 0x04 ; direct from 8255 to ide interface - -ide_cs0_line = 0x08 ; inverter between 8255 and ide interface - -ide_cs1_line = 0x10 ; inverter between 8255 and ide interface - -ide_wr_line = 0x20 ; inverter between 8255 and ide interface - -ide_rd_line = 0x40 ; inverter between 8255 and ide interface - -ide_rst_line = 0x80 ; inverter between 8255 and ide interface - -;------------------------------------------------------------------ -; More symbolic constants... these should not be changed, unless of -; course the IDE drive interface changes, perhaps when drives get -; to 128G and the PC industry will do yet another kludge. - -;some symbolic constants for the ide registers, which makes the -;code more readable than always specifying the address pins - -ide_data = ide_cs0_line -ide_err = ide_cs0_line + ide_a0_line -ide_sec_cnt = ide_cs0_line + ide_a1_line -ide_sector = ide_cs0_line + ide_a1_line + ide_a0_line -ide_cyl_lsb = ide_cs0_line + ide_a2_line -ide_cyl_msb = ide_cs0_line + ide_a2_line + ide_a0_line -ide_head = ide_cs0_line + ide_a2_line + ide_a1_line -ide_command = ide_cs0_line + ide_a2_line + ide_a1_line + ide_a0_line -ide_status = ide_cs0_line + ide_a2_line + ide_a1_line + ide_a0_line -ide_control = ide_cs1_line + ide_a2_line + ide_a1_line -ide_astatus = ide_cs1_line + ide_a2_line + ide_a1_line + ide_a0_line - -;IDE Command Constants. These should never change. - -ide_cmd_recal = 0x10 -ide_cmd_read = 0x20 -ide_cmd_write = 0x30 -ide_cmd_init = 0x91 -ide_cmd_id = 0x0ec -ide_cmd_spindown = 0xe0 -ide_cmd_spinup = 0xe1 - - -; .ORG BIOS ;ORIGIN OF THIS PROGRAM - - -;dwg;NSECTS .EQU ($-CCP)/128 ;WARM START SECTOR COUNT - -; -; JUMP VECTOR FOR INDIVIDUAL SUBROUTINES - - JP BOOT ;COLD START -WBOOTE: JP WBOOT ;WARM START - JP CONST ;CONSOLE STATUS - JP CONIN ;CONSOLE CHARACTER IN - JP CONOUT ;CONSOLE CHARACTER OUT - JP LIST ;LIST CHARACTER OUT (NULL ROUTINE) - JP PUNCH ;PUNCH CHARACTER OUT (NULL ROUTINE) - JP READER ;READER CHARACTER OUT (NULL ROUTINE) - JP HOME ;MOVE HEAD TO HOME POSITION - JP SELDSK ;SELECT DISK - JP SETTRK ;SET TRACK NUMBER - JP SETSEC ;SET SECTOR NUMBER - JP SETDMA ;SET DMA ADDRESS - JP READ ;READ DISK - JP WRITE ;WRITE DISK - JP LISTST ;RETURN LIST STATUS (NULL ROUTINE) - JP SECTRN ;SECTOR TRANSLATE - -; -; FIXED DATA TABLES FOR ALL DRIVES -; 0= RAMDISK, 1=ROMDISK, 2=HDPART1, 3=HDPART2 -; DISK PARAMETER HEADER FOR DISK 00 (RAM Disk) -DPBASE: - .DW 0x0000,0x0000 - .DW 0x0000,0x0000 - .DW DIRBF,DPBLK0 - .DW CHK00,ALL00 - -; DISK PARAMETER HEADER FOR DISK 05 (Large ROM Disk) - .DW 0x0000,0x0000 - .DW 0x0000,0x0000 - .DW DIRBF,DPBLK5 - .DW CHK05,ALL05 - - -; DISK PARAMETER HEADER FOR DISK 02 (8MB disk Partition) - .DW 0x0000,0x0000 - .DW 0x0000,0x0000 - .DW DIRBF,DPBLK2 - .DW CHK02,ALL02 - -; DISK PARAMETER HEADER FOR DISK 03 (8MB disk Partition) - .DW 0x0000,0x0000 - .DW 0x0000,0x0000 - .DW DIRBF,DPBLK3 - .DW CHK03,ALL03 - -; DISK PARAMETER HEADER FOR DISK 04 (??? third disk partition ???) - .DW 0x0000,0x0000 - .DW 0x0000,0x0000 - .DW DIRBF,DPBLK4 - .DW CHK04,ALL04 - -DPBLK0: ;DISK PARAMETER BLOCK (RAMDISK 512K, 448K usable) -SPT_1: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_1: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_1: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_1: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_1: .DW 223 ; BLOCKSIZE [2048] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_1: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_1: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_1: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_1: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_1: .DW 2 ; 2 TRACK RESERVED [FIRST 64K OF RAM] -; Note: changed to 2 tracks to skip over the 1st 64KB or RAM. - -DPBLK1: ;DISK PARAMETER BLOCK (ROMDISK 32KB WITH 16 2K TRACKS, 22K usable) -SPT_0: .DW 16 ; 16 SECTORS OF 128 BYTES PER 2K TRACK -BSH_0: .DB 3 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_0: .DB 7 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_0: .DB 0 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_0: .DW 31 ; BLOCKSIZE [1024] * NUMBER OF BLOCKS + 1 = DRIVE SIZE -DRM_0: .DW 31 ; NUMBER OF DIRECTORY ENTRIES -AL0_0: .DB 0b10000000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_0: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_0: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_0: .DW 5 ; FIRST 5 TRACKS TRACKS RESERVED (10K FOR SYSTEM) - ; SYSTEM IS ROM LOADER, CCP, BDOS, CBIOS, AND MONITOR - ; - ; IMPORTANT NOTE: TRACKS $00 - $04 OF 2K BYTES - ; EACH ARE MARKED WITH THE OFF_0 SET TO 5 AS - ; SYSTEM TRACKS. USABLE ROM DRIVE SPACE - ; STARTING AFTER THE FIFTH TRACK (IE, TRACK $05) - ; MOST LIKELY FIX TO THIS IS PLACING A DUMMY - ; FIRST 10K ROM CONTAINS THE ROM LOADER, MONITOR, - ; CCP, BDOS, BIOS, ETC (5 TRACKS * 2K EACH) - - -DPBLK2: ;DISK PARAMETER BLOCK (IDE HARD DISK 8MB) -SPT_2: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_2: .DB 5 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_2: .DB 31 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_2: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_2: .DW 2039 ; BLOCKSIZE [4096] * NUMBER OF BLOCKS + 1 = DRIVE SIZE - ; HD PARTITION 2 IS 16128 SECTORS LONG - ; AT 512 BYTES EACH WHICH IS - ; 2016 BLOCKS AT 4096 BYTES A PIECE. -DRM_2: .DW 511 ; NUMBER OF DIRECTORY ENTRIES -AL0_2: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_2: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_2: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_2: .DW 1 ; 1 TRACK (32K) RESERVED FOR SYSTEM - -DPBLK3: ;DISK PARAMETER BLOCK (IDE HARD DISK 8MB) -SPT_3: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_3: .DB 5 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_3: .DB 31 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_3: .DB 1 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_3: .DW 2039 ; BLOCKSIZE [4096] * NUMBER OF BLKS + 1 = DRIVE SIZE - ; HD PARTITION 3 IS 16128 SECTORS LONG - ; AT 512 BYTES EACH WHICH IS - ; 2016 BLOCKS AT 4096 BYTES A PIECE. -DRM_3: .DW 511 ; NUMBER OF DIRECTORY ENTRIES -AL0_3: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_3: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_3: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_3: .DW 1 ; 1 TRACK (32K) RESERVED FOR SYSTEM - -DPBLK4: ;DISK PARAMETER BLOCK (IDE HARD DISK 1024K) -SPT_4: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_4: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_4: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_4: .DB 0 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_4: .DW 497 ; BLKSIZE [2048] * NUMBER OF BLKS + 1 = DRIVE SIZE - ; HD PARTITION 4 IS 4032 SECTORS LONG - ; AT 512 BYTES EACH WHICH IS - ; 1008 BLOCKS AT 2048 BYTES A PIECE. - ; NOT USING ALL OF THE AVAILABLE SECTORS SINCE THIS - ; DRIVE IS INTENDED TO EMULATE A ROM DRIVE AND COPIED - ; INTO A ROM IN THE FUTURE. -DRM_4: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_4: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_4: .DB 0b00000000 ; DIRECTORY CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_4: .DW 0 ; SIZE OF DIRECTORY CHECK [0 IF NON REMOVEABLE] -OFF_4: .DW 1 ; 1 TRACK RESERVED [FIRST 32K OF PARTITION] - -; -DPBLK5: ;DISK PARAMETER BLOCK (ROMDISK 1MB) -SPT_5: .DW 256 ; 256 SECTORS OF 128 BYTES PER 32K TRACK -BSH_5: .DB 4 ; BLOCK SHIFT FACTOR (SIZE OF ALLOCATION BLOCK) -BLM_5: .DB 15 ; PART OF THE ALLOCATION BLOCK SIZE MATH -EXM_5: .DB 0 ; DEFINES SIZE OF EXTENT (DIRECTORY INFO) -DSM_5: .DW 495 ; BLKSIZE [2048] * NUMBER OF BLKS +1 =DRIVE SIZE -;DSM_5: .DW 511 ; BLKSIZE [2048] * NUMBER OF BLKS +1 =DRIVE SIZE -DRM_5: .DW 255 ; NUMBER OF DIRECTORY ENTRIES -AL0_5: .DB 0b11110000 ; BIT MAP OF SPACE ALLOCATED TO DIRECTORY -AL1_5: .DB 0b00000000 ; DIR CAN HAVE UP TO 16 BLOCKS ALLOCATED -CKS_5: .DW 0 ; SIZE OF DIR CHECK [0 IF NON REMOVEABLE] -OFF_5: .DW 1 ; 1 TRACK RESERVED [FIRST 32K OF ROM] - -; -; END OF FIXED TABLES -; -; INDIVIDUAL SUBROUTINES TO PERFORM EACH FUNCTION - -BOOT: ;SIMPLEST CASE IS TO JUST PERFORM PARAMETER INITIALIZATION - di ; disable interrupts -; IM 1 ; SET INTERRUPT MODE 1 -; .DB $ED,$56 ; Z80 "IM 1" INSTRUCTION - - ld a,#0x80 - -; out0 ACR -; .BYTE $ED,$39,ACR ; ensure that the ROM is switched out - - out (ACR),a - - ld a,#1 - ld (CDISK),a ; select disk 0 - - ld a,#DEFIOB - ld (IOBYTE),a - -; ei ; enable interrupts - - ld hl,#TXT_STARTUP_MSG - CALL PRTMSG - - JP GOCPM ;INITIALIZE AND GO TO CP/M - -; -WBOOT: ;SIMPLEST CASE IS TO READ THE DISK UNTIL ALL SECTORS LOADED - ; WITH A ROMDISK WE SELECT THE ROM AND THE CORRECT PAGE [0] - ; THEN COPY THE CP/M IMAGE (CCP, BDOS, BIOS, MONITOR) TO HIGH RAM - ; LOAD ADDRESS. - - DI ; DISABLE INTERRUPT - - ld SP,#0x0080 ; use space below buffer for stack - -; IM 1 ; SET INTERRUPT MODE 1 -; .DB $ED,$56 ; Z80 "IM 1" INSTRUCTION - - xor a,a - - ; CHEAP ZERO IN ACC -; mvi a,00h ; switch in the ROM -; out0 ACR -; .BYTE $ED,$39,ACR - - out (ACR),a - - xor a,a - -; out0 RMAP -; .BYTE $ED,$39,$F6 - - out (RMAP),a ; set the rom map - - ; Just reload CCP and BDOS - - ld hl,#ROMSTART_CPM ; where in rom cp/m is stored (1st byte) - ld de,#RAMTARG_CPM ; where in ram to move ccp+BDOS to - ld bc,#MOVSIZ_CPM - ldir - - ld a,#0x80 - out (ACR),a - -; EI ; ENABLE INTERRUPTS - -; -; END OF LOAD OPERATION, SET PARAMETERS AND GO TO CP/M -GOCPM: - ;CPU RESET HANDLER - ld a,#0xC3 ; C32 is a jump opcode - ld (0x0000),a - ld hl,#WBOOTE ; address of warm boot - ld (0x0001),hl ; set addr field for jmp at 0 - - ld (0x0005),a ; for jump to bdos - ld hl,#BDOS - ld (0x0006),hl - - ld bc,#0x0080 ; default DMA address - CALL SETDMA - - ld a,(CDISK) ; get current disk number - ld c,a ; send to the ccp - JP CCP ;GO TO CP/M FOR FURTHER PROCESSING - - -; -;---------------------------------------------------------------------------------------------------------------------- -; N8VEM Home computer I/O handlers -; -; This implementation uses IOBYTE and allocates devices as follows: -; -; TTY - Driver for the Z180 ASCI port 0 -; CRT - Driver for the -; UC1 - Driver for the -; xxx - Driver for the -; -; Logical device drivers - these pass control to the physical -; device drivers depending on the value of the IOBYTE -; - -CONST: ;CONSOLE STATUS, RETURN 0FFH IF CHARACTER READY, 00H IF NOT - - ld a,(IOBYTE) - and a,#3 - cp #0 - jp z,TTYISTS - - cp #1 - jp z,CRTISTS - - jp NULLSTS - - - - -CONIN: ;CONSOLE CHARACTER INTO REGISTER A - ld a,(IOBYTE) - and a,#3 - cp #0 - jp z,TTYIN - cp #1 - jp z,CRTIN - jp NULLIN - - -CONOUT: ;CONSOLE CHARACTER OUTPUT FROM REGISTER C - ld a,(IOBYTE) - and a,#3 ; isolate console bits - cp #0 - jp z,TTYOUT - cp #1 - jp z,CRTOUT - jp NULLOUT - -LIST: ;LIST CHARACTER FROM REGISTER C - jp NULLOUT - - - -LISTST: ;RETURN LIST STATUS (0 IF NOT READY, 1 IF READY) - jp NULLSTS - - ; -PUNCH: ;PUNCH CHARACTER FROM REGISTER C - jp NULLOUT - -; -READER: ;READ CHARACTER INTO REGISTER A FROM READER DEVICE - - jp NULLIN ; currently not used - - - -;---------------------------------------------------------------------------------------------------------------------------------------- -; -; Here are the physical io device drivers -; -; Null driver - this is a dummy driver for the NULL device - -NULLIN: - ld a,#0x1a - ret - -NULLOUT: - ld a,c - ret - -NULLSTS: - ld a,#1 - ret - -; -;--------------------------------------------------------------------------------------------------------------------------------------------- -; -; TTY Driver (programmed i/o) this is the driver for the Home Computer console port -; -TTYIN: - CALL TTYISTS; IS A CHAR READY TO BE READ FROM UART? - cp #0 - jp z,TTYIN - -; IN0 A,(RDR0) - -;dwg; .BYTE $ED,$38,RDR0 - .byte 0xED,0x38,RDR0 - - ret - -TTYOUT: - call TTYOSTS - and a,a - jp z,TTYOUT ; if not repeat - - ld a,c ; get to accum - -; OUT0 (TDR0),A - .byte 0xed,0x39,TDR0 - - ret - -TTYISTS: -; IN0 A,(STAT0) -;dwg; .BYTE $ED,$38,STAT0 -;;dwg;; in0 a,(STAT0) - .byte 0xed,0x38,STAT0 - - and a,#0x80 - ret z ; is there a char ready? 0=no 1=yes - ld a,#0xff - ret ; NO, LEAVE $00 IN A AND RETURN - -TTYOSTS: -; IN0 A,(STAT0) -;dwg; .BYTE $ED,$38,STAT0 -;;dwg;; in0 a,(STAT0) - .byte 0xed,0x38,STAT0 - - and a,#2 - ret z - ld a,#0xff - - ret ; NO, LEAVE $00 IN A AND RETURN -;--------------------------------------------------------------------------------------------------------------------------------------------- -; CRT Driver - This is the driver for the Prop VDU -; - -CRTIN: - jp NULLIN - -CRTOUT: - jp NULLOUT - -CRTISTS: - jp NULLSTS - -CRTOSTS: - jp NULLSTS - - -;--------------------------------------------------------------------------------------------------------------------------------------------- - ;; -; I/O DRIVERS FOR THE DISK FOLLOW -; FOR NOW, WE WILL SIMPLY STORE THE PARAMETERS AWAY FOR USE -; IN THE READ AND WRITE SUBROUTINES -; - -; -; SELECT DISK GIVEN BY REGISTER C -; -SELDSK: - - ld hl,#0 ; error return code - - ld a,c - - cp a,#4 ; must be between 0 and 4 - ret nc ; no carry if 4,5,6,7 - ld a,c - ld (DISKNO),a ; save valid disk number - -; -; DISK NUMBER IS IN THE PROPER RANGE -; COMPUTE PROPER DISK PARAMETER HEADER ADDRESS - - ld l,a ; l = disk num 0,1,2,3,4 - ld h,#0 ; high order - add hl,hl ; * 2 - add hl,hl ; * 4 - add hl,hl ; * 8 - add hl,hl ; * 16 (size of each header) - ld de,#DPBASE - add hl,de ; hl = .DPBASE(DISKNO*16) - RET -; -HOME: ;MOVE TO THE TRACK 00 POSITION OF CURRENT DRIVE - ; TRANSLATE THIS CALL INTO A SETTRK CALL WITH PARAMETER 00 - - ld bc,#0 ; select track zero - -; CALL SETTRK -; RET ;WE WILL MOVE TO 00 ON FIRST READ/WRITE - ; FALL THROUGH TO SETTRK TO STORE VALUE - -SETTRK: ;SET TRACK GIVEN BY REGISTER BC - ld h,b - ld l,c - ld (TRACK),hl - RET -; -SETSEC: ;SET SECTOR GIVEN BY REGISTER BC - ld h,b - ld l,c - ld (SECTOR),hl - RET -; -; TRANSLATE THE SECTOR GIVEN BY BC USING THE -; TRANSLATE TABLE GIVEN BY DE -; ONLY USED FOR FLOPPIES! FOR ROMDISK/RAMDISK IT'S 1:1 -; DO THE NEXT ROUTINE IS A NULL (RETURNS THE SAME) -SECTRN: - ld h,b - ld l,c - RET -; - -SETDMA: ;SET DMA ADDRESS GIVEN BY REGISTERS B AND C - ld l,c - ld h,b - ld (DMAAD),hl - RET - -; READ DISK -; USES DE,DL, BC, ACC FLAGS -; Z80 COULD USE BLOCK MOVE [LDIR] BUT WRITTEN IN 8080 -READ: -; DI ; DISABLE INTERRUPTS - - ld a,(DISKNO) - ; FIND OUT WHICH DRIVE IS BEING REQUESTED - ; ARE WE READING RAM OR ROM? - cp #0 - jp z,READ_RAM_DISK - - cp #1 - jp z,READ_ROM_DISK - - cp #2 - jp z,READ_HDPART1 - - cp #3 - jp z,READ_HDPART2 ; READ FROM 8 MB IDE HD, PARTITION 2 - - cp #4 - jp z,READ_HDPART3 ; READ FROM 1 MB IDE HD, PARTITION 4 - - cp #5 - jp z,READ_HDPART4 ; READ FROM 1 MB IDE HD, PARTITION 5 - - ld a,#1 ; BDOS WILL ALSO PRINT ITS OWN ERROR MESSAGE - ret - - -; -; WRITE DISK -; -WRITE: -; DI ; DISABLE INTERRUPTS - - ld a,(DISKNO) ; get drive - -; ORA A ; SET FLAGS - - cp #0 ; find out which drive is being requested - - jp z,WRITE_RAM_DISK ; write to 448K ram disk - - cp #1 - jp z,RDONLY ; jump to read only routine - - ; READ ONLY, FROM 22K EEPROM DISK, ERROR ON WRITE - cp #2 - jp z,WRITE_HDPART1 ; write to 8MB IDE HD, Part 2 - - cp #3 - jp z,WRITE_HDPART2 ; write to 8MB IDE HD, Part 3 - - cp #4 - jp z,WRITE_HDPART3 ; write to 1MB IDE HD, Part 4 - - cp #5 - jp z,WRITE_HDPART4 ; write to 1MB IDE HD Part 5 - - - ; IF NONE OF THE OTHER DISKS, IT MUST BE - ; THE RAM DISK, SO FALL THROUGH - - ld a,#1 ; send bad sector error back - ; BDOS WILL ALSO PRINT ITS OWN ERROR MESSAGE - ret - - - -RDONLY: -; -; HANDLE WRITE TO READ ONLY -; -; SENDS A MESSAGE TO TERMINAL THAT ROM DRIVE IS NOT WRITEABLE -; DOES A PAUSE THEN RETURNS TO CPM WITH ERROR FLAGGED. THIS IS -; DONE TO ALLOW A POSSIBLE GRACEFUL EXIT (SOME APPS MAY PUKE). -; - - ; CODE TBD, PRINT A HEY WRONG DISK AND PAUSE 5 SEC AND - ; CONTINUE. - - ld hl,#TXT_RO_ERROR ; set hp --> error msg - CALL PRTMSG ; PRINT ERROR MESSAGE - - ld a,#1 ; send bad sector error back - ; BDOS WILL ALSO PRINT ITS OWN ERROR MESSAGE - ; ADD 5 SECOND PAUSE ROUTINE HERE - ret - -; -;-------------------------------------------------------------------------------------------------------------- -; -; DISK DRIVERS... -; -; DRIVER NEED TO DO SEVERAL THINGS FOR ROM AND RAM DISKS. -; - INTERRUPTS ARE NOT ALLOWED DURING LOW RAM/ROM ACCESS (DISABLE!) -; -TRANSLATE TRACK AND SECTOR INTO A POINTER TO WHERE THE 128 BYTE -; SECTOR BEGINS IN THE RAM/ROM -; -TRANSLATE THE DRIVE INTO A RAM/ROM SELECT, COMBINE WITH TRACK ADDRESS -; AND SEND TO THE MAP PORT. -; -COPY 128 BYTE FROM OR TO THE ROM/RAMDISK AND MEM POINTED TO BY DMA -; ADDRESS PREVIOUSLY STORED. -; -RESTORE MAP PORT TO PRIOR CONDITION BEFOR READ/WRITE -; -; - FIRST TRICK IS THAT WE MADE SECTORS 256 AS 256*128=32768. SO WE COPY -; THE LOW SECTOR ADDRESS TO THE LOW BYTE OF THE HL REGISTER AND THEN -; MULTIPLY BY 128. THIS RESULTS IN THE STARTING ADDR IN THE RAM OR ROM -; (0000 -> 7F80H) 32K PAGE. -; -; - TRICK TWO IS THE TRACK ADDRESS EQUALS THE 32K PAGE ADDRESS AND IS A -; DIRECT SELECT THAT CAN BE COPIED TO THE MAP PORT D0 THROUGH D5. D7 -; SELECTS THE DRIVE (ROM OR RAM). -; THAT MEANS THE LOW BYTE OF TRACK CONTAINS THE D0-D5 VALUE AND -; DISKNO HAS THE DRIVE SELECTED. WE FIRST COPY DISKNO TO ACC -; AND RIGHTSHIFT IT TO PLACE THAT IN BIT7, WE THEN ADD LOW BYTE OF -; TRACK TO ACC AND THEN SEND THAT TO THE MAP PORT. -; -; NOTE 1: A WRITE TO ROM SHOULD BE FLAGGED AS AN ERROR. -; NOTE 2: RAM MUST START AS A "FORMATTED DISK" IF BATTERY BACKED UP -; IT'S A DO ONCE AT COLD COLD START. IF NOT BATTERY BACKED UP -; IT WILL HAVE TO BE DONE EVERY TIME THE SYSTEM IS POWERED. -; FORMATTING THE RAM IS SIMPLE AS CLEARING THE DIRECTORY AREA -; TO A VALUE OF E5H (THE FIRST 8K OF TRACK 1 OR THE RAMDISK). -; IT COULD BE DONE AS A SIMPLE UTILITY PROGRAM STORED IN ROMDISK -; OR ANYTIME COLBOOT IS CALLED(LESS DESIREABLE). -; -; -WE NOW CAN COPY TO/FROM AS CORRECT FOR THE DEVICE 128 BYTES (SECTOR) -; TO OR FROM THE DMA ADDRESS. ALMOST! SINCE ROM OR RAM IS BEING PAGED -; WE HAVE TO COPY ANYTHING DESTINED FOR BELOW 8000H TO TEMP BUFFER -; THEN HANDLE THE PAGING. -; -; -; - LAST STEP IS TO RESTORE THE MAP PORT TO POINT TO THE RAM (TRACK 0) -; SO THE CP/M MEMORY MAP IS ALL RAM AGAIN AND NOT POINTING INTO THE -; DATA AREAS OR THE "DISK". -; SINCE THE RAM 0TH PAGE IS NOMINALLY THE LOW 32K OF RAM IN THE i -; SYSTEM WE CAN SEND A SIMPLE MVI A,80H ; OUT MPCL_ROM; MVI A,00H ; -; OUT MPCL_RAM. -; -; - THE READ OR WRITE OPERATION IS DONE. -; -; -; -; -; -; - - ; ACCESS ALGORITHM (ONLY APPLICABLE TO 32K ROM PART!) -READ_RAM_DISK: - DI ; IF RAM, PROCEED WITH NORMAL TRACK/SECTOR READ - CALL SECPAGE ; SETUP FOR READ OF RAM OR ROM DISK - - ld hl,(TRACK) ; multiply by 8 (4k segs) - -;dwg; dad h ; *2 - add hl,hl - -;dwg; dad h ; *4 - add hl,hl - -;dwg; dad h ; *8 - add hl,hl - -;dwg; MOV A,L ; get track in L - ld a,l - -; out0 BBR ; select RAM bank - -;dwg; .BYTE $ED,$39,BBR -;;dwg;; out0 BBR - .byte 0xed,0x39,BBR - - ld hl,#TMPBUF ; load hl with temp buf addr - ld d,h ; get it into de - ld e,l - ld hl,(SECST) ; rom/ram addr - ld bc,#128 - ldir - -; -; NOW WITH THE ROM/RAM DATA IN THE BUFFER WE CAN NOW MOVE IT TO THE -; DMA ADDRESS (IN RAM) -; - - ld a,#0 ; return to system bank - -; out0 BBR ; select RAM bank - -;dwg; .BYTE $ED,$39,BBR -;;dwg;; out0 BBR - .db 0xed,0x39,BBR - -; CALL RPAGE ; SET PAGE TO CP/M RAM - -; EI ; RE-ENABLE INTERRUPTS - - ld hl,(DMAAD) ; load hl with dma addr - ld e,l - ld d,h ; get it into de - ld hl,#TMPBUF ; get rom/ram addr - ld bc,#128 - ldir - - ld a,#0 - RET - -READ_ROM_DISK: - DI ; IF RAM, PROCEED WITH NORMAL TRACK/SECTOR READ - CALL SECPAGE ; SETUP FOR READ OF RAM OR ROM DISK - CALL PAGERB ; SET PAGER WITH DRIVE AND TRACK - - ld hl,#TMPBUF ; load hl with temp buf address - ld d,h - ld e,l ; get it into de - ld hl,(SECST) ; rom/ram address - ld bc,#128 - ldir - -; -; NOW WITH THE ROM/RAM DATA IN THE BUFFER WE CAN NOW MOVE IT TO THE -; DMA ADDRESS (IN RAM) -; - CALL RPAGE ; SET PAGE TO CP/M RAM -; EI ; RE-ENABLE INTERRUPTS - - ld hl,(DMAAD) ; load hl with dma address - ld e,l - ld d,h - ld hl,#TMPBUF ; get rom/ram address - ld bc,#128 - ldir - - ld a,#0 - ret - - -WRITE_RAM_DISK: - - ld hl,#TMPBUF ; load hl with temp buf address - ld d,h - ld e,l - ld hl,(DMAAD) - ld bc,#128 - ldir - -; -; NOW THAT DATA IS IN THE TEMP BUF WE SET TO RAM PAGE -; FOR WRITE. -; - DI - CALL SECPAGE ; GET RAM PAGE WRITE ADDRESS - - ld hl,(TRACK) - - add hl,hl ; *2 multiply by 8 (4k segs) - add hl,hl ; *4 - add hl,hl ; *8 - ld a,l ; get track in l - -; out0 BBR ; select RAM bank -;dwg; .BYTE $ED,$39,BBR -;;dwg;; out0 BBR - .db 0xed,0x39,BBR - - ld hl,(SECST) ; load hl with dma addr (where to write to) - ld d,h ; get it into de - ld e,l - ld hl,#TMPBUF ; get temp buffer address - ld bc,#128 - ldir - - ld a,#0 ; return to system bank - -; out0 BBR ; select RAM bank -;dwg; .BYTE $ED,$39,BBR -;;dwg;; out0 BBR - .db 0xed,0x39,BBR - -; EI - ; RE-ENABLE INTERRUPTS - ld a,#0 - ret - -;------------------------------------------------------------------- - -; Logical disk drivers - -READ_HDPART1: - - ld hl,#1 ; init LBA offset sector lo word - ld (LBA_OFFSET_LO),hl - ld hl,#0 ; init LBA offset sector hi word - ld (LBA_OFFSET_HI),hl - JP READ_HDPARTX - -READ_HDPART2: - ld hl,#0x4001 ; init LBA offset sector lo word - ld (LBA_OFFSET_LO),hl - ld hl,#0 ; init LBA offset sector hi word - ld (LBA_OFFSET_HI),hl - JP READ_HDPARTX - -READ_HDPART3: -READ_HDPART4: - ret - - -READ_HDPARTX: - - ; BDOS TRACK PARAMETER (16 BITS) - ; BDOS SECTOR PARAMETER (16 BITS) - - ld hl,(TRACK) ; load track number (word) - ld b,l ; save lower 8 bits (tracks 0-255) - ld hl,(SECTOR) ; load sector number (word) - ld h,b ; hl is 8 bit track in h, 8 bit sector in l - CALL CONVERT_IDE_SECTOR_CPM ; COMPUTE WHERE CP/M SECTOR IS ON THE - ; IDE PARTITION - - ; MAP COMPUTED IDE HD SECTOR TO LBA REGISTERS - - ; LBA REGISTERS STORE 28 BIT VALUE OF IDE HD SECTOR ADDRESS - - ld a,(LBA_TARGET_LO) ; load LBA reg 0 with sector addr to read - ld (IDE_LBA0),a - ld a,(LBA_TARGET_LO+1) ; load LBA reg 1 with sector addr t read - ld (IDE_LBA1),a - ld a,(LBA_TARGET_HI) ; load LBA reg 2 with sector addr to read - ld (IDE_LBA2),a - ld a,(LBA_TARGET_HI+1) ; load LBA reg 3 with sector addr to read - and a,#0b00001111 ; only lower 4 bits are valid - add a,#0b11100000 ; enable LBA bits 5:7=111 in IDE_LBA3 - ld (IDE_LBA3),a - CALL IDE_READ_SECTOR ; READ THE IDE HARD DISK SECTOR - -; NEED TO ADD ERROR CHECKING HERE, CARRY FLAG IS SET IF IDE_READ_SECTOR SUCCESSFUL! - - ; COMPUTE STARTING ADDRESS OF CP/M SECTOR IN READ IDE HD SECTOR BUFFER - - ld hl,#SECTOR_BUFFER ; load hl with sector buffer address - - ld a,(SECTOR_INDEX) ; get the sector index (off in buff) - - RRC a ; MOVE BIT 0 TO BIT 7 - RRC a ; DO AGAIN - IN EFFECT MULTIPLY BY 64 - - ld d,#0 ; put result as 16 value in de, upper byte in d is 0 - - ld e,a ; put addr offset in e - - add hl,de ; multiply by 2, total mult is x 128 - - add hl,de ; cp/m sect starting addr in IDE HD sector buffer - - ; COPY CP/M SECTOR TO BDOS DMA ADDRESS BUFFER - - ld D,H ; TRANSFER HL REGISTERS TO DE - ld E,L - ld hl,(DMAAD) ; LOAD HL WITH DMA ADDRESS - ex de,hl - ld bc,#128 - ldir - -; EI ; RE-ENABLE INTERRUPTS - - ld a,#0 ; return err code read successful a=0 - ret - - - - -;------------------------------------------------------------------- - - -WRITE_HDPART1: - -; DI ; DISABLE INTERRUPTS - - ld hl,#1 ; init LBA offset sector lo word - ld (LBA_OFFSET_LO),hl - ld hl,#0 ; init LBA offset sector hi word - ld (LBA_OFFSET_HI),hl - JP WRITE_HDPARTX - - -WRITE_HDPART2: - -; DI ; DISABLE INTERRUPTS - - ld hl,#0x4001 ; init LBA offset sector lo word - ld (LBA_OFFSET_LO),hl - ld hl,#0 ; init LBA offset sector hi word - ld (LBA_OFFSET_HI),hl - JP WRITE_HDPARTX - -;------------------------------------------------------------------- - -WRITE_HDPART3: ; STUB -WRITE_HDPART4: ; STUB - RET - -;------------------------------------------------------------------- - - -WRITE_HDPARTX: - - ; BDOS TRACK PARAMETER (16 BITS) - ; BDOS SECTOR PARAMETER (16 BITS) - - ld hl,(TRACK) ; load track # (word) - ld b,l ; save lower 8 bits (tracks 0-255) - ld hl,(SECTOR) ; load sector # (word) - ld h,b ; hl is 8 bit track in h, 8 bit sector in l - - CALL CONVERT_IDE_SECTOR_CPM ; COMPUTE WHERE THE CP/M SECT IS ON THE - ; IDE PARTITION - - ; MAP COMPUTED IDE HD SECTOR TO LBA REGISTERS - ; LBA REGISTERS STORE 28 BIT VALUE OF IDE HD SECTOR ADDRESS - - ld a,(LBA_TARGET_LO) ; load LBA reg 0 with sect addr to read - ld (IDE_LBA0),a - ld a,(LBA_TARGET_LO+1) ; load LBA reg 1 with sect addr to read - ld (IDE_LBA1),a - ld a,(LBA_TARGET_HI) ; load LBA reg 2 with sect addr to read - ld (IDE_LBA2),a - ld a,(LBA_TARGET_HI+1) ; load LBA reg 3 with sect addr to read - and a,#0b00001111 ; only lower four bits are valid - add a,#0b11100000 ; enable LBA bits 5:7=111 in IDE_LBA3 - ld (IDE_LBA3),a - CALL IDE_READ_SECTOR ; READ THE IDE HARD DISK SECTOR - - ; NEED TO ADD ERROR CHECKING HERE, - ; CARRY FLAG IS SET IF IDE_READ_SECTOR SUCCESSFUL! - - ; COMPUTE STARTING ADDRESS OF CP/M SECTOR IN READ IDE HD SECTOR BUFFER - - ld hl,#SECTOR_BUFFER ; load hl with sector buffer address - - ld a,(SECTOR_INDEX) ; get the sector index (off in buffer) - - RRC a ; MOVE BIT 0 TO BIT 7 - RRC a ; DO AGAIN - IN EFFECT MULTIPLY BY 64 - - ld d,#0 ; put result as 16 bit value in de - ; UPPER BYTE IN D IS $00 - ld e,a ; put address offset in e - - add hl,de ; cp/m starting addr in buffer - - add hl,de ; *2, total mult is x128 - - ; KEEP CP/M SECTOR ADDRESS FOR LATER USE - ; COPY CP/M SECTOR FROM BDOS DMA ADDRESS BUFFER - ld (SECST),hl - - ld hl,(SECST) ; setup destination - ex de,hl ; swap for next LHLD - ld hl,(DMAAD) ; setup source - ld bc,#128 ; byte count - ldir - - ; IDE HD SECTOR IS NOW UPDATED - ; WITH CURRENT CP/M SECTOR DATA SO WRITE TO DISK - - CALL IDE_WRITE_SECTOR ; WRITE THE UPDATED IDE HARD DISK SECTOR - - ; NEED TO ADD ERROR CHECKING HERE, - ; CARRY FLAG IS SET IF IDE_WRITE_SECTOR SUCCESSFUL! - -; EI ; RE-ENABLE INTERRUPTS - - ld a,#0 ; return error code write successful a=0 - ret - -;------------------------------------------------------------------- - - -PRTMSG: - ld a,(hl) ; get char into A - cp a,#END ; test for end byte - jp z,PRTMSG1 ; jump if end byte is found - ld c,a ; put char to print in C for conout - CALL CONOUT ; SEND CHARACTER TO CONSOLE FROM REG C - inc hl ; inc ptr to next char - JP PRTMSG ; TRANSMIT LOOP -PRTMSG1: - ret - - -; -; UTILITY ROUTINE FOR SECTOR TO PAGE ADDRESS -; USES HL AND CARRY -; -SECPAGE: - ld hl,(SECTOR) - add hl,hl ; * 2 - add hl,hl ; * 4 - add hl,hl ; * 8 - add hl,hl ; * 16 - add hl,hl ; * 32 - add hl,hl ; * 64 - add hl,hl ; * 128 - ld (SECST),hl ; save sector starting address - ret - -; -; PAGER BYTE CREATION -; ASSEMBLES DRIVE AND TRACK AND SENDS IT TO PAGER PORT -; -PAGERB: - ld hl,(TRACK) - ld a,l ; or l with acc to combine track and drive -; out0 ACR+2 - .db 0xed,0x39,ACR+2 ; rom latch - ld a,#0 ; switch in the rom -; out0 ACR - .db 0xed,0x39,ACR - ld (PAGER),a ; save copy (just because) - ld (DB_PAGER),a ; save another copy for debug - RET - -; -; RESET PAGER BACK TO RAM. -; -RPAGE: - - ld a,#0x80 ; deselect rom page -; out0 ACR - .db 0xed,0x39,ACR - - ld a,#0 ; set to RAM track 0 -;dwg; STA PAGER ; SAVE COPY OF PAGER BYTE - ld (PAGER),a - - RET - - -CONVERT_IDE_SECTOR_CPM: - - ; COMPUTES WHERE THE CP/M SECTOR IS IN THE IDE PARTITION - ; IDE HD SECTORS ARE 512 BYTES EACH, CP/M SECTORS ARE 128 BYTES EACH - ; MAXIMUM SIZE OF CP/M DISK IS 8 MB = 65536 (16 BITS) X 128 BYTES PER SECTOR - ; IDE HD PARTITION CAN HAVE AT MOST 16384 IDE SECTORS -> 65536 CP/M SECTORS - ; EACH IDE HD SECTOR CONTAINS 4 ADJACENT CP/M SECTORS - ; - ; - ; INPUT: - ; IDE HD PARTITION STARTING SECTOR NUMBER (FROM PARTITION TABLE) - ; - LOWER 16 BITS STORED IN LBA_OFFSET_LO - ; - UPPER 16 BITS STORED IN LBA_OFFSET_HI - ; PARTITION OFFSET IN HL (16 BITS) - ; - A UNIQUELY COMPUTED FUNCTION BASED ON GEOMETRY OF DISKS NUMBER OF - ; CP/M TRACKS AND SECTORS SPECIFIED IN DPB - ; - ; - ; OUTPUT: - ; IDE TARGET SECTOR (SENT TO IDE HD CONTROLLER FOR READ OPERATION) - ; - LOWER 16 BITS STORED IN LBA_TARGET_LO - ; - UPPER 16 BITS STORED IN LBA_TARGET_HI - ; CP/M TO IDE HD SECTOR MAPPING PARAMETER STORED IN SECTOR_INDEX - ; - 8 BIT VALUE WITH 4 LEGAL STATES (00, 01, 02, 04) WHICH IS - ; TO BE USED TO COMPUTE STARTING ADDRESS OF 128 BYTE CP/M SECTOR ONCE - ; 512 BYTE IDE HD SECTOR READ INTO MEMORY BUFFER - ; - - ; ROTATE WITH CARRY 16 BIT TRACK,SECTOR VALUE IN HL TO GET 14 BIT IDE HD - ; TARGET SECTOR IN PARTITION - ; KEEP LAST TWO BITS IN B FOR IDE HD SECTOR TO CP/M SECTOR TRANSLATION - - ; COMPUTE SECTOR_INDEX - -;;dwg;; What is the point of this? the next inst sets A anyway?? - xor a,a ; zero accumulator - - ld a,l ; store the last 2 bits of l in b - and a,#0b00000011 - ld b,a - - ld (SECTOR_INDEX),a ; locates the 128 cpm sector in buffer - - ; COMPUTE WHICH IDE HD SECTOR TO READ TO WITHIN 4 CP/M SECTORS - ; SHIFTS 16 BIT PARTITION OFFSET TO THE RIGHT 2 BITS AND ADDS RESULT TO - ; IDE HD PARTITION STARTING SECTOR - - ; SHIFT PARTITION OFFSET RIGHT 1 BIT - - scf ; set the carry flag, so we can clear it - ccf ; Complement Carry Flag - - ld a,h ; 16 bit rotate hl with carry - rra - ld h,a ; rotate HL right 1 bit (divide by 2) - ld a,l - rra - ld l,a - - ; SHIFT PARTITION OFFSET RIGHT 1 BIT - - scf - ccf ; CLEAR CARRY FLAG - - ld a,h ; 16 bit rotate HL with carry - rra - ld H,A ; ROTATE HL RIGHT 1 BIT (DIVIDE BY 2) - ld A,L - rra - ld L,A - - ; ADD RESULTING 14 BIT VALUE TO IDE HD PARTITION STARTING SECTOR - ; STORE RESULT IN IDE HD TARGET SECTOR PARAMETER - - ld a,(LBA_OFFSET_LO) ; 16 bit add of LBA_OFFSET_LO with hl - ADD L - ld (LBA_TARGET_LO),a - ld a,(LBA_OFFSET_LO+1) - adc a,h - ld (LBA_TARGET_LO+1),a ; store overflow bit in carry - ld hl,#0 - ld a,(LBA_OFFSET_HI) ; 16 bit add w/carry of LBA_OFFSET_HI w/ - adc a,l - ld (LBA_TARGET_HI),a - ld a,(LBA_OFFSET_HI+1) - adc a,h - ld (LBA_TARGET_HI+1),a - RET - - - -;------------------------------------------------------------------------------------ -; Parallel port IDE driver -; -; -; ----------------------------------------------------------------------------- - - ;read a sector, specified by the 4 bytes in "lba", - ;Return, acc is zero on success, non-zero for an error -IDE_READ_SECTOR: - call ide_wait_not_busy ;make sure drive is ready - call wr_lba ;tell it which sector we want - - ld a,#ide_command ; select IDE reg - ld c,#ide_cmd_read - call ide_write ;ask the drive to read it - call ide_wait_drq ;wait until it's got the data -; bit 0,a -; ani 1 -; jnz get_err - - ld hl,#SECTOR_BUFFER - call read_data ;grab the data - ld a,#0 ; ? set successful return code ? - - ret - - -;----------------------------------------------------------------------------- - - - ;write a sector, specified by the 4 bytes in "lba", - ;whatever is in the buffer gets written to the drive! - ;Return, acc is zero on success, non-zero for an error -IDE_WRITE_SECTOR: - call ide_wait_not_busy ;make sure drive is ready - call wr_lba ;tell it which sector we want - - ld a,#ide_command - ld c,#ide_cmd_write - call ide_write ;tell drive to write a sector - call ide_wait_drq ;wait unit it wants the data - -; bit 0,a ; check for error returned -; ani 1 -; jnz get_err - - ld hl,#SECTOR_BUFFER - call write_data ;give the data to the drive - call ide_wait_not_busy ;wait until the write is complete - -; bit 0,a -; ani 1 -; jnz get_err - -; ld a,#0 ; SHOULD THIS BE HERE (Doug's idea) - ret - - -;----------------------------------------------------------------------------- - -;--------ide_hard_reset--------------------------------------------------------------- - ;do a hard reset on the drive, by pulsing its reset pin. - ;this should usually be followed with a call to "ide_init". -;------------------------------------------------------------------------------------------- -ide_hard_reset: - call set_ppi_rd - ld a,#ide_rst_line - out (IDECTL),a ; assert rst line on IDE interface - ld bc,#0 -rst_dly: - dec b - jp nz,rst_dly - ld a,#0 ; this could be XOR A,A (shorter) - out (IDECTL),a ; deassert RST line on IDE interface - ret - -;------------------------------------------------------------------------------ -; IDE INTERNAL SUBROUTINES -;------------------------------------------------------------------------------ - - - -;---------------------------------------------------------------------------- - ;when an error occurs, we get bit 0 of A set from a call to ide_drq - ;or ide_wait_not_busy (which read the drive's status register). If - ;that error bit is set, we should jump here to read the drive's - ;explaination of the error, to be returned to the user. If for - ;some reason the error code is zero (shouldn't happen), we'll - ;return 255, so that the main program can always depend on a - ;return of zero to indicate success. -get_err: - ld a,#ide_err - call ide_read - ld a,c - jp z,gerr2 - ret -gerr2: - ld a,#255 - ret - -;----------------------------------------------------------------------------- - -ide_wait_not_busy: - ld a,#ide_status ; wait for RDY bit to be set - call ide_read - ld a,c - and a,#0x80 ; isolate busy bit - jp nz,ide_wait_not_busy - ret - - -ide_wait_ready: - ld a,#ide_status ; wait for RDY bit to be set - call ide_read - ld a,c - and a,#0b11000000 ; mask off busy and ready bits - xor a,#0b01000000 ; we want Busy(7) to be 0 and ready(6) to be 1 - jp nz,ide_wait_ready - ret - - ;Wait for the drive to be ready to transfer data. - ;Returns the drive's status in Acc -ide_wait_drq: - ld a,#ide_status ; waut for DRQ bit to be set - call ide_read - ld a,c - and a,#0b10001000 ; mask off busy(7) and DRQ(3) - xor a,#0b00001000 ; we want busy(7) to be 0 and DRQ (3) to be 1 - jp nz,ide_wait_drq - ret - - - -;------------------------------------------------------------------------------ - - ;Read a block of 512 bytes (one sector) from the drive - ;and store it in memory @ HL -read_data: - ld b,#0 -rdblk2: - push bc - push hl - ld a,#ide_data - call ide_read ; read form data port - pop hl - ld (hl),c - inc hl - ld (hl),b - inc hl - pop bc - dec b - jp nz,rdblk2 - ret - -;----------------------------------------------------------------------------- - - ;Write a block of 512 bytes (at HL) to the drive -write_data: - ld b,#0 -wrblk2: - push bc - ld c,(hl) ; lsb - inc hl - ld b,(hl) ; msb - inc hl - push hl - ld a,#ide_data - call ide_write - pop hl - pop bc - dec b - jp nz,wrblk2 - ret - - -;----------------------------------------------------------------------------- - - ;write the logical block address to the drive's registers -wr_lba: - ld a,(IDE_LBA0+3) ; MSB - and a,#0x0f - or a,#0xe0 - ld c,a - ld a,#ide_head - call ide_write - ld a,(IDE_LBA0+2) - ld c,a - ld a,#ide_cyl_msb - call ide_write - ld a,(IDE_LBA0+1) - ld c,a - ld a,#ide_cyl_lsb - call ide_write - ld a,(IDE_LBA0) ; LSB - ld c,a - ld a,#ide_sector - call ide_write - ld c,#1 - ld a,#ide_sec_cnt - call ide_write - - ret - -;------------------------------------------------------------------------------- - -; Low Level I/O to the drive. These are the routines that talk -; directly to the drive, via the 8255 chip. Normally a main -; program would not call to these. - - ;Do a read bus cycle to the drive, using the 8255. - ;input A = ide regsiter address - ;output C = lower byte read from ide drive - ;output B = upper byte read from ide drive - -ide_read: - push af ; save register value - call set_ppi_rd ; setup for a read cycle - pop af ; restore register value - out (IDECTL),a ;drive address onto control lines - or a,#ide_rd_line ; assert RD pin - out (IDECTL),a - push af ; save register value - in a,(IDELSB) ; read lower byte - ld c,a ; save in c reg - in a,(IDEMSB) ; read upper byte - ld b,a ; save in reg b - pop af ; restore reg value - xor a,#ide_rd_line ; deassert RD signal - out (IDECTL),a - ld a,#0 ;; DWG SAYS couln't this be a 1 byter? - out (IDECTL),a ;deassert all control pins - ret - - ;Do a write bus cycle to the drive, via the 8255 - ;input A = ide register address - ;input register C = lsb to write - ;input register B = msb to write - ; - - -ide_write: - push af ; save IDE reg valure - call set_ppi_wr ; setup for a write cycle - ld a,c ; get value to be written - out (IDELSB),a - ld a,b ; get value to be written - out (IDEMSB),a - pop af ; restore saved IDE reg - out (IDECTL),a ; drive address onto control lines - or a,#ide_wr_line ; assert write pin - out (IDECTL),a - xor a,#ide_wr_line ; deasser write pin - out (IDECTL),a ;drive address onto control lines - ld a,#0 ;; DWG SAYS couldn't this be 1 byter? - out (IDECTL),a ; release bus signals - ret - - -;----------------------------------------------------------------------------------- -; ppi setup routine to configure the appropriate PPI mode -; -;------------------------------------------------------------------------------------ - -set_ppi_rd: - ld a,#rd_ide_8255 - out (PIO1CONT),a ;config 8255 chip, read mode - ret - -set_ppi_wr: - ld a,#wr_ide_8255 - out (PIO1CONT),a ;config 8255 chip, write mode - ret - -;----------------------------------------------------------------------------- -; End of PPIDE disk driver -;------------------------------------------------------------------------------------ - - -; TEXT STRINGS - -TXT_RO_ERROR: - .DB CR,LF - .ascii "ERROR: WRITE TO READ ONLY DISK" - .DB END - -TXT_STARTUP_MSG: - .DB CR,LF - .ascii "CP/M-80 VERSION 2.2C FOR THE " - .ascii "N8VEM N8" - .ascii " (PPIDE)" - .DB CR,LF - .DB END - -; -; THE REMAINDER OF THE CBIOS IS RESERVED UNINITIALIZED -; DATA AREA, AND DOES NOT NEED TO BE A PART OF THE -; SYSTEM MEMORY IMAGE -; -TRACK: .DS 2 ; TWO BYTES FOR TRACK # -SECTOR: .DS 2 ; TWO BYTES FOR SECTOR # -DMAAD: .DS 2 ; DIRECT MEMORY ADDRESS -DISKNO: .DS 1 ; DISK NUMBER 0-15 - - -PAGER: .DB 1 ; COPY OF PAGER BYTE - -DB_PAGER: .db 0xff ; copy of pager byte - -V_SECTOR: .DS 2 ; TWO BYTES FOR VIRTUAL SECTOR # -SECST: .DS 2 ; SECTOR IN ROM/RAM START ADDRESS - - -LBA_OFFSET_LO: .DW 0 ; IDE HD PART STARTING SECTOR (LOW 16 BITS) -LBA_OFFSET_HI: .DW 0 ; IDE HD PART STARTING SECTOR (HI 16 BITS, 12 USED) -LBA_TARGET_LO: .DW 0 ; IDE HD PART TARGET SECTOR (LOW 16 BITS) -LBA_TARGET_HI: .DW 0 ; IDE HD PART TARGET SECTOR (HI 16 BITS, 12 USED) - -IDE_LBA0: .DS 1 ;SET LBA 0:7 -IDE_LBA1: .DS 1 ;SET LBA 8:15 -IDE_LBA2: .DS 1 ;SET LBA 16:23 -IDE_LBA3: .DS 1 ;LOWEST 4 BITS USED ONLY TO ENABLE LBA MODE - -SECTOR_INDEX: .DB 0 ;WHERE 128 BYTE CP/M SECTOR IS IN 512 BYTE IDE HD SECTOR - - -; -; SCRATCH RAM AREA FOR BDOS USE -; -; Note: this can extend up to the beginning of the debug monitor however -; there is a limitation in the amount of space available in the EPROM -; -;BEGDAT .EQU $ ;BEGINNING OF DATA AREA -; -; - -SECTOR_BUFFER: .DS 512 ;Deblocking STORAGE FOR 512 BYTE IDE HD SECTOR - -;dwg;TMPBUF .EQU SECTOR_BUFFER -TMPBUF = SECTOR_BUFFER - -DIRBF: .DS 128 ;SCRATCH DIRECTORY AREA -ALL00: .DS 4 ;ALLOCATION VECTOR 0 (DSM/8 = 1 BIT PER BLOCK) -ALL01: .DS 32 ;ALLOCATION VECTOR 1 (225/8) -ALL02: .DS 255 ;ALLOCATION VECTOR 2 (2040/8) -ALL03: .DS 255 ;ALLOCATION VECTOR 3 (2040/8) -ALL04: .DS 64 ;ALLOCATION VECTOR 4 (511/8) -ALL05: .DS 64 ;ALLOCATION VECTOR 5 (495/8) -; -CHK00: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK01: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK02: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK03: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK04: .DS 0 ; NOT USED FOR FIXED MEDIA -CHK05: .DS 0 ; NOT USED FOR FIXED MEDIA - -; DOUG SAYS - THIS NEEDS TO BE DONE ANOTHER WAY NO ORGS IN REL SEG -; -; .ORG $F2FF -; -; F2FF - desired org -; - E600 - BIOS ORG -; ______ -; 0CFF - necessary offset in this module -; -; 0CCF ; where we want to be -; - 0AA9 ; where we are now -; ______ -; 0256 - adjustment to reach desired org in rel segment -; - - .ds 0x0256 ; THIS NEEDS TO BE ADJUSTED SO LASTBYTE IS AT 0CFF - -LASTBYTE: .DB 0xE5 ; note this is just to force out the last byte. - ; this address will actually fall within the - ; allocation vector block - -_cbioshc_end:: - .area _CODE - .area _CABS diff --git a/branches/dgg/cpurom/src/ccpb03.s b/branches/dgg/cpurom/src/ccpb03.s deleted file mode 100644 index 3eedda69..00000000 --- a/branches/dgg/cpurom/src/ccpb03.s +++ /dev/null @@ -1,1345 +0,0 @@ - .title ccpb03.s derived from ccpb03.asm - .sbttl by Douglas Goodall 5/16/2011 dwg - - .module ccpb03 - .optsdcc -mz80 - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - .globl _ccp -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - .area _DATA -;-------------------------------------------------------- -; overlayable items in ram -;-------------------------------------------------------- - .area _OVERLAY -;-------------------------------------------------------- -; external initialized ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - .area _HOME - .area _GSINIT - .area _GSFINAL - .area _GSINIT -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - .area _HOME - .area _HOME -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - -; .area _CODE - .area _CCPB03 - -_ccp_start:: -_ccp: - -MON = 1 ;ADD THE CCP MON COMMAND -USRDSP = 1 ;SHOW THE USER NUMBER -CHKU0B = 1 ;CHECK FOR TRANSIENTS ON USER 0 TOO -ENDFIL = 1 ;FILE FULL CCP SIZE -; -;************************************************************** -;* -;* C C P - C O N S O L E C O M M A N D P R O C E S S O R -;* -;************************************************************** -;* -IOBYTE = 3 ; I/O DEFINITION BYTE. -TDRIVE = 4 ; CURRENT DRIVE NAME AND USER NUMBER. -ENTRY = 5 ; ENTRY POINT FOR THE CP/M BDOS. -TFCB = 0x5C ; DEFAULT FILE CONTROL BLOCK. -TBUFF = 0x80 ; I/O BUFFER AND COMMAND LINE STORAGE. -TBASE = 0x0100 ; TRANSIANT PROGRAM STORAGE AREA. -MONADR = 0x0FC00 ;MONITOR PROGRAM -; -; SET CONTROL CHARACTER .EQUATES. -; -CNTRLC = 0x03 ; CONTROL-C -CNTRLE = 0x05 ; CONTROL-E -BS = 0x08 ; BACKSPACE -TAB = 0x09 ; TAB -LF = 0x0A ; LINE FEED -FF = 0x0C ; FORM FEED -CR = 0x0D ; CARRIAGE RETURN -CNTRLP = 0x10 ; CONTROL-P -CNTRLR = 0x12 ; CONTROL-R -CNTRLS = 0x13 ; CONTROL-S -CNTRLU = 0x15 ; CONTROL-U -CNTRLX = 0x18 ; CONTROL-X -CNTRLZ = 0x1A ; CONTROL-Z (END-OF-FILE MARK) -ASTERICK = 0x2A -COLON = 0x3A -LESSTHAN = 0x3C -ASCSPACE = 0x20 ; SPACE -PERIOD = 0x2e ; PERIOD -EQUAL = 0x3D -GREATERTHAN = 0x3E -QUESTION = 0x3F ;QUESTION MARK -UNDERSCORE = 0x5F -LCURLY = 0x7B ; { -DEL = 0x7F ; RUBOUT -; -; SET ORIGIN FOR CP/M -; - -NK = 59 ;SYSTEM SIZE -BASE = (NK*1024)-0x5000 -CCPO = BASE+0x3400 ;CCP ORIGIN -BDOSO = BASE+0x3C00 ;BDOS ORIGIN -BIOSO = BASE+0x4A00 ;BIOS ORIGIN - -;dwg; .ORG CCPO -; -CBASE: JP COMMAND ; EXECUTE COMMAND PROCESSOR (CCP). - JP CLEARBUF ; ENTRY TO EMPTY INPUT BUFFER BEFORE STARTING CCP. - -; -; STANDARD CP/M CCP INPUT BUFFER. FORMAT IS (MAX LENGTH), -; (ACTUAL LENGTH), (CHAR #1), (CHAR #2), (CHAR #3), ETC. -; -INBUFF: .DB 127 ; LENGTH OF INPUT BUFFER. - -; N8VEM - if add any text after this point, change .DB 0 below to length -; and put a 0 after the text, and delete the same number of zeros after the dig -; so that inpoint ends up at the same spot -; INBUFF+1 is cleared on the next warm boot, so only runs once. - .DB 0 ;CURRENT LENGTH OF CONTENTS. - - -; .DB 17 ; Autoboot length of string -; .DB "SUPERSUB AUTOEXEC" -; .DB 0 ; zero at end - - - .ascii "COPYRIGHT" - .ascii " 1979 (C) BY " - .ascii "DIGITAL RESEARCH " - .ascii " " - -;dwg; .ORG INBUFF+128 -;dwg; becausje org's are not allowed in rel areas, it has been -; replaced with the following array of .db's to achieve the -; same purpose - .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .db 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - .db 0,0 - -;; s/b d086 here - -INPOINT:.DW INBUFF+2 ; INPUT LINE POINTER -NAMEPNT:.DW 0 ; INPUT LINE POINTER USED FOR ERROR MESSAGE. POINTS TO -; ;START OF NAME IN ERROR. -; -; ROUTINE TO PRINT (A) ON THE CONSOLE. ALL REGISTERS USED. -; -PRINT: LD E,A ; SETUP BDOS CALL. - LD C,#2 - JP ENTRY -; -; ROUTINE TO PRINT (A) ON THE CONSOLE AND TO SAVE (BC). -; -PRINTB: PUSH BC - CALL PRINT - POP BC - RET -; -; ROUTINE TO SEND A CARRIAGE RETURN, LINE FEED COMBINATION -; TO THE CONSOLE. -; -CRLF: LD A,#CR - CALL PRINTB - LD A,#LF - JP PRINTB -; -; ROUTINE TO SEND ONE SPACE TO THE CONSOLE AND SAVE (BC). -; -SPACE: LD A,#ASCSPACE - JP PRINTB -; -; ROUTINE TO PRINT CHARACTER STRING POINTED TO BE (BC) ON THE -; CONSOLE. IT MUST TERMINATE WITH A NULL BYTE. -; -PLINE: PUSH BC - CALL #CRLF - POP HL -PLINE2: LD A,(HL) - OR A - RET Z - INC HL - PUSH HL - CALL PRINT - POP HL - JP PLINE2 -; -; ROUTINE TO RESET THE DISK SYSTEM. -; -RESDSK: LD C,#13 - JP ENTRY -; -; ROUTINE TO SELECT DISK (A). -; -DSKSEL: LD E,A - LD C,#14 - JP ENTRY -; -; ROUTINE TO CALL BDOS AND SAVE THE RETURN CODE. THE ZERO -; FLAG IS SET ON A RETURN OF 0FFH. -; -ENTRY1: CALL ENTRY - LD (RTNCODE),A ; SAVE RETURN CODE. - INC A ; SET ZERO IF 0FFH RETURNED. - RET -; -; ROUTINE TO OPEN A FILE. (DE) MUST POINT TO THE FCB. -; -OPEN: LD C,#15 - JP ENTRY1 -; -; ROUTINE TO OPEN FILE AT (FCB). -; -OPENFCB:XOR A ; CLEAR THE RECORD NUMBER BYTE AT FCB+32 - LD (FCB+32),A - LD DE,#FCB - JP OPEN -; -; ROUTINE TO CLOSE A FILE. (DE) POINTS TO FCB. -; -CLOSE: LD C,#16 - JP ENTRY1 -; -; ROUTINE TO SEARCH FOR THE FIRST FILE WITH AMBIGUEOUS NAME -; (DE). -; -SRCHFST:LD C,#17 - JP ENTRY1 -; -; SEARCH FOR THE NEXT AMBIGEOUS FILE NAME. -; -SRCHNXT:LD C,#18 - JP ENTRY1 -; -; SEARCH FOR FILE AT (FCB). -; -SRCHFCB:LD DE,#FCB - JP SRCHFST -; -; ROUTINE TO DELETE A FILE POINTED TO BY (DE). -; -DELETE: LD C,#19 - JP ENTRY -; -; ROUTINE TO CALL THE BDOS AND SET THE ZERO FLAG IF A ZERO -; STATUS IS RETURNED. -; -ENTRY2: CALL ENTRY - OR A ; SET ZERO FLAG IF APPROPRIATE. - RET -; -; ROUTINE TO READ THE NEXT RECORD FROM A S.EQUENTIAL FILE. -; (DE) POINTS TO THE FCB. -; -RDREC: LD C,#20 - JP ENTRY2 -; -; ROUTINE TO READ FILE AT (FCB). -; -READFCB:LD DE,#FCB - JP RDREC -; -; ROUTINE TO WRITE THE NEXT RECORD OF A S.EQUENTIAL FILE. -; (DE) POINTS TO THE FCB. -; -WRTREC: LD C,#21 - JP ENTRY2 -; -; ROUTINE TO CREATE THE FILE POINTED TO BY (DE). -; -CREATE: LD C,#22 - JP ENTRY1 -; -; ROUTINE TO RENAME THE FILE POINTED TO BY (DE). NOTE THAT -; THE NEW NAME STARTS AT (DE+16). -; -RENAM: LD C,#23 - JP ENTRY -; -; GET THE CURRENT USER CODE. -; -GETUSR: LD E,#0x0FF -; -; ROUTNE TO GET OR SET THE CURRENT USER CODE. -; IF (E) IS FF THEN THIS IS A GET, ELSE IT IS A SET. -; -GETSETUC: - LD C,#32 - JP ENTRY -; -; ROUTINE TO SET THE CURRENT DRIVE BYTE AT (TDRIVE). -; -SETCDRV:CALL GETUSR ; GET USER NUMBER - ADD A,A ; AND SHIFT INTO THE UPPER 4 BITS. - ADD A,A - ADD A,A - ADD A,A - LD HL,#CDRIVE ; NOW ADD IN THE CURRENT DRIVE NUMBER. - OR (HL) - LD (TDRIVE),A ; AND SAVE. - RET -; -; MOVE CURRENTLY ACTIVE DRIVE DOWN TO (TDRIVE). -; -MOVECD: LD A,(CDRIVE) - LD (TDRIVE),A - RET -; -; ROUTINE TO CONVERT (A) INTO UPPER CASE ASCII. ONLY LETTERS -; ARE AFFECTED. -; -UPPER: CP #0x41 ; CHECK FOR LETTERS IN THE RANGE OF 'A' TO 'Z'. - RET C - CP #LCURLY - RET NC - AND #0x5F ; CONVERT IT IF FOUND. - RET -; -; ROUTINE TO GET A LINE OF INPUT. WE MUST CHECK TO SEE IF THE -; USER IS IN (BATCH) MODE. IF SO, THEN READ THE INPUT FROM FILE -; ($$$.SUB). AT THE END, RESET TO CONSOLE INPUT. -; -GETINP: LD A,(BATCH) ; IF =0, THEN USE CONSOLE INPUT. - OR A - JP Z,GETINP1 -; -; USE THE SUBMIT FILE ($$$.SUB) WHICH IS PREPARED BY A -; SUBMIT RUN. IT MUST BE ON DRIVE (A) AND IT WILL BE DELETED -; IF AND ERROR OCCURES (LIKE EOF). -; - LD A,(CDRIVE) ; SELECT DRIVE 0 IF NEED BE. - OR A - LD A,#0 ; ALWAYS USE DRIVE A FOR SUBMIT. - CALL NZ,DSKSEL ; SELECT IT IF R.EQUIRED. - LD DE,#BATCHFCB - CALL OPEN ; LOOK FOR IT. - JP Z,GETINP1 ; IF NOT THERE, USE NORMAL INPUT. - LD A,(BATCHFCB+15) ; GET LAST RECORD NUMBER+1. - DEC A - LD (BATCHFCB+32),A - LD DE,#BATCHFCB - CALL RDREC ; READ LAST RECORD. - JP NZ,GETINP1 ; QUIT ON END OF FILE. -; -; MOVE THIS RECORD INTO INPUT BUFFER. -; - LD DE,#INBUFF+1 - LD HL,#TBUFF ; DATA WAS READ INTO BUFFER HERE. - LD B,#128 ; ALL 128 CHARACTERS MAY BE USED. - CALL HL2DE ; (HL) TO (DE), (B) BYTES. - LD HL,#BATCHFCB+14 - LD (HL),#0 ; ZERO OUT THE 'S2' BYTE. - INC HL ; AND DECREMENT THE RECORD COUNT. - DEC (HL) - LD DE,#BATCHFCB ; CLOSE THE BATCH FILE NOW. - CALL CLOSE - JP Z,GETINP1 ; QUIT ON AN ERROR. - LD A,(CDRIVE) ; RE-SELECT PREVIOUS DRIVE IF NEED BE. - OR A - CALL NZ,DSKSEL ; DON'T DO NEEDLESS SELECTS. -; -; PRINT LINE JUST READ ON CONSOLE. -; - LD HL,#INBUFF+2 - CALL PLINE2 - CALL CHKCON ; CHECK CONSOLE, QUIT ON A KEY. - JP Z,GETINP2 ; JUMP IF NO KEY IS PRESSED. -; -; TERMINATE THE SUBMIT JOB ON ANY KEYBOARD INPUT. DELETE THIS -; FILE SUCH THAT IT IS NOT RE-STARTED AND JUMP TO NORMAL KEYBOARD -; INPUT SECTION. -; - CALL DELBATCH ; DELETE THE BATCH FILE. - JP CMMND1 ; AND RESTART COMMAND INPUT. -; -; GET HERE FOR NORMAL KEYBOARD INPUT. DELETE THE SUBMIT FILE -; INCASE THERE WAS ONE. -; -GETINP1:CALL DELBATCH ; DELETE FILE ($$$.SUB). - CALL SETCDRV ; RESET ACTIVE DISK. - LD C,#10 ; GET LINE FROM CONSOLE DEVICE. - LD DE,#INBUFF - CALL ENTRY - CALL MOVECD ; RESET CURRENT DRIVE (AGAIN). -; -; CONVERT INPUT LINE TO UPPER CASE. -; -GETINP2:LD HL,#INBUFF+1 - LD B,(HL) ; (B)=CHARACTER COUNTER. -GETINP3:INC HL - LD A,B ; END OF THE LINE? - OR A - JP Z,GETINP4 - LD A,(HL) ; CONVERT TO UPPER CASE. - CALL UPPER - LD (HL),A - DEC B ; ADJUST CHARACTER COUNT. - JP GETINP3 -GETINP4:LD (HL),A ; ADD TRAILING NULL. - LD HL,#INBUFF+2 - LD (INPOINT),HL ; RESET INPUT LINE POINTER. - RET -; -; ROUTINE TO CHECK THE CONSOLE FOR A KEY PRESSED. THE ZERO -; FLAG IS SET IS NONE, ELSE THE CHARACTER IS RETURNED IN (A). -; -CHKCON: LD C,#11 ; CHECK CONSOLE. - CALL ENTRY - OR A - RET Z ; RETURN IF NOTHING. - LD C,#1 ; ELSE GET CHARACTER. - CALL ENTRY - OR A ; CLEAR ZERO FLAG AND RETURN. - RET -; -; ROUTINE TO GET THE CURRENTLY ACTIVE DRIVE NUMBER. -; -GETDSK: LD C,#25 - JP ENTRY -; -; SET THE STABDARD DMA ADDRESS. -; -STDDMA: LD DE,#TBUFF -; -; ROUTINE TO SET THE DMA ADDRESS TO (DE). -; -DMASET: LD C,#26 - JP ENTRY -; -; DELETE THE BATCH FILE CREATED BY SUBMIT. -; -DELBATCH: - LD HL,#BATCH ; IS BATCH ACTIVE? - LD A,(HL) - OR A - RET Z - LD (HL),#0 ; YES, DE-ACTIVATE IT. - XOR A - CALL DSKSEL ; SELECT DRIVE 0 FOR SURE. - LD DE,#BATCHFCB ; AND DELETE THIS FILE. - CALL DELETE - LD A,(CDRIVE) ; RESET CURRENT DRIVE. - JP DSKSEL -; -; PRINT BACK FILE NAME WITH A '?' TO INDICATE A SYNTAX ERROR. -; -SYNERR: CALL CRLF ; END CURRENT LINE. - LD HL,(NAMEPNT) ; THIS POINTS TO NAME IN ERROR. -SYNERR1:LD A,(HL) ; PRINT IT UNTIL A SPACE OR NULL IS FOUND. - CP #ASCSPACE - JP Z,SYNERR2 - OR A - JP Z,SYNERR2 - PUSH HL - CALL PRINT - POP HL - INC HL - JP SYNERR1 -SYNERR2:LD A,#QUESTION ; ADD TRAILING '?'. - CALL PRINT - CALL CRLF - CALL DELBATCH ; DELETE ANY BATCH FILE. - JP CMMND1 ; AND RESTART FROM CONSOLE INPUT. -; -; CHECK CHARACTER AT (DE) FOR LEGAL COMMAND INPUT. NOTE THAT THE -; ZERO FLAG IS SET IF THE CHARACTER IS A DELIMITER. -; -CHECK: LD A,(DE) - OR A - RET Z - CP #ASCSPACE ; CONTROL CHARACTERS ARE NOT LEGAL HERE. - JP C,SYNERR - RET Z ; CHECK FOR VALID DELIMITER. - CP #EQUAL - RET Z - CP #UNDERSCORE - RET Z - CP #PERIOD - RET Z - CP #COLON - RET Z - CP #0x3b - RET Z - CP #LESSTHAN - RET Z - CP #GREATERTHAN - RET Z - RET -; -; GET THE NEXT NON-BLANK CHARACTER FROM (DE). -; -NONBLANK: - LD A,(DE) - OR A ; STRING ENDS WITH A NULL. - RET Z - CP #ASCSPACE - RET NZ - INC DE - JP NONBLANK -; -; ADD (HL)=(HL)+(A) -; -ADDHL: ADD A,L - LD L,A - RET NC ; TAKE CARE OF ANY CARRY. - INC H - RET -; -; CONVERT THE FIRST NAME IN (FCB). -; -CONVFST:LD A,#0 -; -; FORMAT A FILE NAME (CONVERT * TO '?', ETC.). ON RETURN, -; (A)=0 IS AN UNAMBIGEOUS NAME WAS SPECIFIED. ENTER WITH (A) .EQUAL TO -; THE POSITION WITHIN THE FCB FOR THE NAME (EITHER 0 OR 16). -; -CONVERT:LD HL,#FCB - CALL ADDHL - PUSH HL - PUSH HL - XOR A - LD (CHGDRV),A ; INITIALIZE DRIVE CHANGE FLAG. - LD HL,(INPOINT) ; SET (HL) AS POINTER INTO INPUT LINE. - EX DE,HL - CALL NONBLANK ; GET NEXT NON-BLANK CHARACTER. - EX DE,HL - LD (NAMEPNT),HL ; SAVE POINTER HERE FOR ANY ERROR MESSAGE. - EX DE,HL - POP HL - LD A,(DE) ; GET FIRST CHARACTER. - OR A - JP Z,CONVRT1 - SBC A,#0x41-1 ; MIGHT BE A DRIVE NAME, CONVERT TO BINARY. - LD B,A ; AND SAVE. - INC DE ; CHECK NEXT CHARACTER FOR A ':'. - LD A,(DE) - CP #COLON - JP Z,CONVRT2 - DEC DE ; NOPE, MOVE POINTER BACK TO THE START OF THE LINE. -CONVRT1:LD A,(CDRIVE) - LD (HL),A - JP CONVRT3 -CONVRT2:LD A,B - LD (CHGDRV),A ; SET CHANGE IN DRIVES FLAG. - LD (HL),B - INC DE -; -; CONVERT THE BASIC FILE NAME. -; -CONVRT3:LD B,#8 -CONVRT4:CALL CHECK - JP Z,CONVRT8 - INC HL - CP #ASTERICK ; NOTE THAT AN '*' WILL FILL THE REMAINING - JP NZ,CONVRT5 ; FIELD WITH '?'. - LD (HL),#QUESTION - JP CONVRT6 -CONVRT5:LD (HL),A - INC DE -CONVRT6:DEC B - JP NZ,CONVRT4 -CONVRT7:CALL CHECK ; GET NEXT DELIMITER. - JP Z,GETEXT - INC DE - JP CONVRT7 -CONVRT8:INC HL ; BLANK FILL THE FILE NAME. - LD (HL),#ASCSPACE - DEC B - JP NZ,CONVRT8 -; -; GET THE EXTENSION AND CONVERT IT. -; -GETEXT: LD B,#3 - CP #PERIOD - JP NZ,GETEXT5 - INC DE -GETEXT1:CALL CHECK - JP Z,GETEXT5 - INC HL - CP #ASTERICK - JP NZ,GETEXT2 - LD (HL),#QUESTION - JP GETEXT3 -GETEXT2:LD (HL),A - INC DE -GETEXT3:DEC B - JP NZ,GETEXT1 -GETEXT4:CALL CHECK - JP Z,GETEXT6 - INC DE - JP GETEXT4 -GETEXT5:INC HL - LD (HL),#ASCSPACE - DEC B - JP NZ,GETEXT5 -GETEXT6:LD B,#3 -GETEXT7:INC HL - LD (HL),#0 - DEC B - JP NZ,GETEXT7 - EX DE,HL - LD (INPOINT),HL ; SAVE INPUT LINE POINTER. - POP HL -; -; CHECK TO SEE IF THIS IS AN AMBIGEOUS FILE NAME SPECIFICATION. -; SET THE (A) REGISTER TO NON ZERO IF IT IS. -; - LD BC,#11 ; SET NAME LENGTH. -GETEXT8:INC HL - LD A,(HL) - CP #QUESTION ; ANY QUESTION MARKS? - JP NZ,GETEXT9 - INC B ; COUNT THEM. -GETEXT9:DEC C - JP NZ,GETEXT8 - LD A,B - OR A - RET -; -; CP/M COMMAND TABLE. NOTE COMMANDS CAN BE EITHER 3 OR 4 CHARACTERS LONG. -; - .if MON -NUMCMDS = 7 ; NUMBER OF COMMANDS - .else -NUMCMDS = 6 ; NUMBER OF COMMANDS - .endif - -CMDTBL: .ascii "DIR " - .ascii "ERA " - .ascii "TYPE" - .ascii "SAVE" - .ascii "REN " - .ascii "USER" - .if MON - .ascii "MON " - .ENDIF - -CMDADR: .DW DIRECT - .DW ERASE - .DW TYPE - .DW SAVE - .DW RENAME - .DW USER - .IF MON - .DW MONITOR - .ENDIF - .DW UNKNOWN -; -; SEARCH THE COMMAND TABLE FOR A MATCH WITH WHAT HAS JUST -; BEEN ENTERED. IF A MATCH IS FOUND, THEN WE JUMP TO THE -; PROPER SECTION. ELSE JUMP TO (UNKNOWN). -; ON RETURN, THE (C) REGISTER IS SET TO THE COMMAND NUMBER -; THAT MATCHED (OR NUMCMDS+1 IF NO MATCH). -; -SEARCH: LD HL,#CMDTBL - LD C,#0 -SEARCH1:LD A,C - CP #NUMCMDS ; THIS COMMANDS EXISTS. - RET NC - LD DE,#FCB+1 ; CHECK THIS ONE. - LD B,#4 ; MAX COMMAND LENGTH. -SEARCH2:LD A,(DE) - CP (HL) - JP NZ,SEARCH3 ; NOT A MATCH. - INC DE - INC HL - DEC B - JP NZ,SEARCH2 - LD A,(DE) ; ALLOW A 3 CHARACTER COMMAND TO MATCH. - CP #ASCSPACE - JP NZ,SEARCH4 - LD A,C ; SET RETURN REGISTER FOR THIS COMMAND. - RET -SEARCH3:INC HL - DEC B - JP NZ,SEARCH3 -SEARCH4:INC C - JP SEARCH1 -; -; SET THE INPUT BUFFER TO EMPTY AND THEN START THE COMMAND -; PROCESSOR (CCP). -; -CLEARBUF: - XOR A - LD (INBUFF+1),A ; SECOND BYTE IS ACTUAL LENGTH. -COMMAND:LD SP,#CCPSTACK ; SETUP STACK AREA. - PUSH BC ; NOTE THAT (C) SHOULD BE .EQUAL TO: - LD A,C ; (UUUUDDDD) WHERE 'UUUU' IS THE USER NUMBER - RRA ; AND 'DDDD' IS THE DRIVE NUMBER. - RRA - RRA - RRA - AND #0x0F ; ISOLATE THE USER NUMBER. - LD E,A - CALL GETSETUC ; AND SET IT. - CALL RESDSK ; RESET THE DISK SYSTEM. - LD (BATCH),A ; CLEAR BATCH MODE FLAG. - POP BC - LD A,C - AND #0x0F ; ISOLATE THE DRIVE NUMBER. - LD (CDRIVE),A ; AND SAVE. - CALL DSKSEL ; ...AND SELECT. - LD A,(INBUFF+1) - OR A ; ANYTHING IN INPUT BUFFER ALREADY? - JP NZ,CMMND2 ; YES, WE JUST PROCESS IT. -; -; ENTRY POINT TO GET A COMMAND LINE FROM THE CONSOLE. -; -CMMND1: LD SP,#CCPSTACK ; SET STACK STRAIGHT. - CALL CRLF ; START A NEW LINE ON THE SCREEN. - CALL GETDSK ; GET CURRENT DRIVE. - ADD A,#0x41 - CALL PRINT ; PRINT CURRENT DRIVE. - .IF USRDSP - CALL GETUSR ;GET CURRENT USER NUMBER - CP #10 ;TWO DIGITS? - JR C,CMMND3 ;NO - LD A,#0x31 ;PRINT LEADING '1' - CALL PRINT - CALL GETUSR ;GET CURRENT USER NUMBER - SUB #10 ;SUBTRACT 10 -CMMND3: ADD A,#0x30 - CALL PRINT - .ENDIF - LD A,#GREATERTHAN - CALL PRINT ; AND ADD PROMPT. - CALL GETINP ; GET LINE FROM USER. -; -; PROCESS COMMAND LINE HERE. -; -CMMND2: LD DE,#TBUFF - CALL DMASET ; SET STANDARD DMA ADDRESS. - CALL GETDSK - LD (CDRIVE),A ; SET CURRENT DRIVE. - CALL CONVFST ; CONVERT NAME TYPED IN. - CALL NZ,SYNERR ; WILD CARDS ARE NOT ALLOWED. - LD A,(CHGDRV) ; IF A CHANGE IN DRIVES WAS INDICATED, - OR A ; THEN TREAT THIS AS AN UNKNOWN COMMAND - JP NZ,UNKNOWN ; WHICH GETS EXECUTED. - CALL SEARCH ; ELSE SEARCH COMMAND TABLE FOR A MATCH. -; -; NOTE THAT AN UNKNOWN COMMAND RETURNS -; WITH (A) POINTING TO THE LAST ADDRESS -; IN OUR TABLE WHICH IS (UNKNOWN). -; - LD HL,#CMDADR ; NOW, LOOK THRU OUR ADDRESS TABLE FOR COMMAND (A). - LD E,A ; SET (DE) TO COMMAND NUMBER. - LD D,#0 - ADD HL,DE - ADD HL,DE ; (HL)=(CMDADR)+2*(COMMAND NUMBER). - LD A,(HL) ; NOW PICK OUT THIS ADDRESS. - INC HL - LD H,(HL) - LD L,A - JP (HL) ; NOW EXECUTE IT. -; -; READ ERROR WHILE TYPEING A FILE. -; -RDERROR:LD BC,#RDERR - JP PLINE -RDERR: .asciz "Read Error" - -; -; R.EQUIRED FILE WAS NOT LOCATED. -; -NONE: LD BC,#NOFILE - JP PLINE -NOFILE: .asciz "No File" -; -; DECODE A COMMAND OF THE FORM 'A>FILENAME NUMBER{ FILENAME}. -; NOTE THAT A DRIVE SPECIFIER IS NOT ALLOWED ON THE FIRST FILE -; NAME. ON RETURN, THE NUMBER IS IN REGISTER (A). ANY ERROR -; CAUSES 'FILENAME?' TO BE PRINTED AND THE COMMAND IS ABORTED. -; -DECODE: CALL CONVFST ; CONVERT FILENAME. - LD A,(CHGDRV) ; DO NOT ALLOW A DRIVE TO BE SPECIFIED. - OR A - JP NZ,SYNERR - LD HL,#FCB+1 ; CONVERT NUMBER NOW. - LD BC,#11 ; (B)=SUM REGISTER, (C)=MAX DIGIT COUNT. -DECODE1:LD A,(HL) - CP #ASCSPACE ; A SPACE TERMINATES THE NUMERAL. - JP Z,DECODE3 - INC HL - SUB #0x30 ; MAKE BINARY FROM ASCII. - CP #10 ; LEGAL DIGIT? - JP NC,SYNERR - LD D,A ; YES, SAVE IT IN (D). - LD A,B ; COMPUTE (B)=(B)*10 AND CHECK FOR OVERFLOW. - AND #0x0E0 - JP NZ,SYNERR - LD A,B - RLCA - RLCA - RLCA ; (A)=(B)*8 - ADD A,B ; .......*9 - JP C,SYNERR - ADD A,B ; .......*10 - JP C,SYNERR - ADD A,D ; ADD IN NEW DIGIT NOW. -DECODE2:JP C,SYNERR - LD B,A ; AND SAVE RESULT. - DEC C ; ONLY LOOK AT 11 DIGITS. - JP NZ,DECODE1 - RET -DECODE3:LD A,(HL) ; SPACES MUST FOLLOW (WHY?). - CP #ASCSPACE - JP NZ,SYNERR - INC HL -DECODE4:DEC C - JP NZ,DECODE3 - LD A,B ; SET (A)=THE NUMERIC VALUE ENTERED. - RET -; -; MOVE 3 BYTES FROM (HL) TO (DE). NOTE THAT THERE IS ONLY -; ONE REFERENCE TO THIS AT (A2D5H). -; -MOVE3: LD B,#3 -; -; MOVE (B) BYTES FROM (HL) TO (DE). -; -HL2DE: LD A,(HL) - LD (DE),A - INC HL - INC DE - DEC B - JP NZ,HL2DE - RET -; -; COMPUTE (HL)=(TBUFF)+(A)+(C) AND GET THE BYTE THAT'S HERE. -; -EXTRACT:LD HL,#TBUFF - ADD A,C - CALL ADDHL - LD A,(HL) - RET -; -; CHECK DRIVE SPECIFIED. IF IT MEANS A CHANGE, THEN THE NEW -; DRIVE WILL BE SELECTED. IN ANY CASE, THE DRIVE BYTE OF THE -; FCB WILL BE SET TO NULL (MEANS USE CURRENT DRIVE). -; -DSELECT:XOR A ; NULL OUT FIRST BYTE OF FCB. - LD (FCB),A - LD A,(CHGDRV) ; A DRIVE CHANGE INDICATED? - OR A - RET Z - DEC A ; YES, IS IT THE SAME AS THE CURRENT DRIVE? - LD HL,#CDRIVE - CP (HL) - RET Z - JP DSKSEL ; NO. SELECT IT THEN. -; -; CHECK THE DRIVE SELECTION AND RESET IT TO THE PREVIOUS -; DRIVE IF IT WAS CHANGED FOR THE PRECEEDING COMMAND. -; -RESETDR:LD A,(CHGDRV) ; DRIVE CHANGE INDICATED? - OR A - RET Z - DEC A ; YES, WAS IT A DIFFERENT DRIVE? - LD HL,#CDRIVE - CP (HL) - RET Z - LD A,(CDRIVE) ; YES, RE-SELECT OUR OLD DRIVE. - JP DSKSEL - - .IF MON -; -;************************************************************** -;* -;* M O N I T O R C O M M A N D -;* -;************************************************************** -; -MONITOR: JP MONADR - .ENDIF - -; -;************************************************************** -;* -;* D I R E C T O R Y C O M M A N D -;* -;************************************************************** -; -DIRECT: CALL CONVFST ; CONVERT FILE NAME. - CALL DSELECT ; SELECT INDICATED DRIVE. - LD HL,#FCB+1 ; WAS ANY FILE INDICATED? - LD A,(HL) - CP #ASCSPACE - JP NZ,DIRECT2 - LD B,#11 ; NO. FILL FIELD WITH '?' - SAME AS *.*. -DIRECT1:LD (HL),#QUESTION - INC HL - DEC B - JP NZ,DIRECT1 -DIRECT2:LD E,#0 ; SET INITIAL CURSOR POSITION. - PUSH DE - CALL SRCHFCB ; GET FIRST FILE NAME. - CALL Z,NONE ; NONE FOUND AT ALL? -DIRECT3:JP Z,DIRECT9 ; TERMINATE IF NO MORE NAMES. - LD A,(RTNCODE) ; GET FILE'S POSITION IN SEGMENT (0-3). - RRCA - RRCA - RRCA - AND #0x60 ; (A)=POSITION*32 - LD C,A - LD A,#10 - CALL EXTRACT ; EXTRACT THE TENTH ENTRY IN FCB. - RLA ; CHECK SYSTEM FILE STATUS BIT. - JP C,DIRECT8 ; WE DON'T LIST THEM. - POP DE - LD A,E ; BUMP NAME COUNT. - INC E - PUSH DE - AND #3 ; AT END OF LINE? - PUSH AF - JP NZ,DIRECT4 - CALL CRLF ; YES, END THIS LINE AND START ANOTHER. - PUSH BC - CALL GETDSK ; START LINE WITH ('A:'). - POP BC - ADD A,#0x41 - CALL PRINTB - LD A,#COLON - CALL PRINTB - JP DIRECT5 -DIRECT4:CALL SPACE ; ADD SEPERATOR BETWEEN FILE NAMES. - LD A,#COLON - CALL PRINTB -DIRECT5:CALL SPACE - LD B,#1 ; 'EXTRACT' EACH FILE NAME CHARACTER AT A TIME. -DIRECT6:LD A,B - CALL EXTRACT - AND #0x7F ; STRIP BIT 7 (STATUS BIT). - CP #ASCSPACE ; ARE WE AT THE END OF THE NAME? - JP NZ,DRECT65 - POP AF ; YES, DON'T PRINT SPACES AT THE END OF A LINE. - PUSH AF - CP #3 - JP NZ,DRECT63 - LD A,#9 ; FIRST CHECK FOR NO EXTENSION. - CALL EXTRACT - AND #0x7F - CP #ASCSPACE - JP Z,DIRECT7 ; DON'T PRINT SPACES. -DRECT63:LD A,#ASCSPACE ; ELSE PRINT THEM. -DRECT65:CALL PRINTB - INC B ; BUMP TO NEXT CHARACTER PSOITION. - LD A,B - CP #12 ; END OF THE NAME? - JP NC,DIRECT7 - CP #9 ; NOPE, STARTING EXTENSION? - JP NZ,DIRECT6 - CALL SPACE ; YES, ADD SEPERATING SPACE. - JP DIRECT6 -DIRECT7:POP AF ; GET THE NEXT FILE NAME. -DIRECT8:CALL CHKCON ; FIRST CHECK CONSOLE, QUIT ON ANYTHING. - JP NZ,DIRECT9 - CALL SRCHNXT ; GET NEXT NAME. - JP DIRECT3 ; AND CONTINUE WITH OUR LIST. -DIRECT9:POP DE ; RESTORE THE STACK AND RETURN TO COMMAND LEVEL. - JP GETBACK -; -;************************************************************** -;* -;* E R A S E C O M M A N D -;* -;************************************************************** -; -ERASE: CALL CONVFST ; CONVERT FILE NAME. - CP #11 ; WAS '*.*' ENTERED? - JP NZ,ERASE1 - LD BC,#YESNO ; YES, ASK FOR CONFIRMATION. - CALL PLINE - CALL GETINP - LD HL,#INBUFF+1 - DEC (HL) ; MUST BE EXACTLY 'Y'. - JP NZ,CMMND1 - INC HL - LD A,(HL) - CP #0x59 - JP NZ,CMMND1 - INC HL - LD (INPOINT),HL ; SAVE INPUT LINE POINTER. -ERASE1: CALL DSELECT ; SELECT DESIRED DISK. - LD DE,#FCB - CALL DELETE ; DELETE THE FILE. - INC A - CALL Z,NONE ; NOT THERE? - JP GETBACK ; RETURN TO COMMAND LEVEL NOW. -YESNO: .asciz "All (Y/N)?" -; -;************************************************************** -;* -;* T Y P E C O M M A N D -;* -;************************************************************** -; -TYPE: CALL CONVFST ; CONVERT FILE NAME. - JP NZ,SYNERR ; WILD CARDS NOT ALLOWED. - CALL DSELECT ; SELECT INDICATED DRIVE. - CALL OPENFCB ; OPEN THE FILE. - JP Z,TYPE5 ; NOT THERE? - CALL CRLF ; OK, START A NEW LINE ON THE SCREEN. - LD HL,#NBYTES ; INITIALIZE BYTE COUNTER. - LD (HL),#0x0FF ; SET TO READ FIRST SECTOR. -TYPE1: LD HL,#NBYTES -TYPE2: LD A,(HL) ; HAVE WE WRITTEN THE ENTIRE SECTOR? - CP #128 - JP C,TYPE3 - PUSH HL ; YES, READ IN THE NEXT ONE. - CALL READFCB - POP HL - JP NZ,TYPE4 ; END OR ERROR? - XOR A ; OK, CLEAR BYTE COUNTER. - LD (HL),A -TYPE3: INC (HL) ; COUNT THIS BYTE. - LD HL,#TBUFF ; AND GET THE (A)TH ONE FROM THE BUFFER (TBUFF). - CALL ADDHL - LD A,(HL) - CP #CNTRLZ ; END OF FILE MARK? - JP Z,GETBACK - CALL PRINT ; NO, PRINT IT. - CALL CHKCON ; CHECK CONSOLE, QUIT IF ANYTHING READY. - JP NZ,GETBACK - JP TYPE1 -; -; GET HERE ON AN END OF FILE OR READ ERROR. -; -TYPE4: DEC A ; READ ERROR? - JP Z,GETBACK - CALL RDERROR ; YES, PRINT MESSAGE. -TYPE5: CALL RESETDR ; AND RESET PROPER DRIVE - JP SYNERR ; NOW PRINT FILE NAME WITH PROBLEM. -; -;************************************************************** -;* -;* S A V E C O M M A N D -;* -;************************************************************** -; -SAVE: CALL DECODE ; GET NUMERIC NUMBER THAT FOLLOWS SAVE. - PUSH AF ; SAVE NUMBER OF PAGES TO WRITE. - CALL CONVFST ; CONVERT FILE NAME. - JP NZ,SYNERR ; WILD CARDS NOT ALLOWED. - CALL DSELECT ; SELECT SPECIFIED DRIVE. - LD DE,#FCB ; NOW DELETE THIS FILE. - PUSH DE - CALL DELETE - POP DE - CALL CREATE ; AND CREATE IT AGAIN. - JP Z,SAVE3 ; CAN'T CREATE? - XOR A ; CLEAR RECORD NUMBER BYTE. - LD (FCB+32),A - POP AF ; CONVERT PAGES TO SECTORS. - LD L,A - LD H,#0 - ADD HL,HL ; (HL)=NUMBER OF SECTORS TO WRITE. - LD DE,#TBASE ; AND WE START FROM HERE. -SAVE1: LD A,H ; DONE YET? - OR L - JP Z,SAVE2 - DEC HL ; NOPE, COUNT THIS AND COMPUTE THE START - PUSH HL ; OF THE NEXT 128 BYTE SECTOR. - LD HL,#128 - ADD HL,DE - PUSH HL ; SAVE IT AND SET THE TRANSFER ADDRESS. - CALL DMASET - LD DE,#FCB ; WRITE OUT THIS SECTOR NOW. - CALL WRTREC - POP DE ; RESET (DE) TO THE START OF THE LAST SECTOR. - POP HL ; RESTORE SECTOR COUNT. - JP NZ,SAVE3 ; WRITE ERROR? - JP SAVE1 -; -; GET HERE AFTER WRITING ALL OF THE FILE. -; -SAVE2: LD DE,#FCB ; NOW CLOSE THE FILE. - CALL CLOSE - INC A ; DID IT CLOSE OK? - JP NZ,SAVE4 -; -; PRINT OUT ERROR MESSAGE (NO SPACE). -; -SAVE3: LD BC,#NOSPACE - CALL PLINE -SAVE4: CALL STDDMA ; RESET THE STANDARD DMA ADDRESS. - JP GETBACK - -NOSPACE: .asciz "No Space" -; -;************************************************************** -;* -;* R E N A M E C O M M A N D -;* -;************************************************************** -; -RENAME: CALL CONVFST ; CONVERT FIRST FILE NAME. - JP NZ,SYNERR ; WILD CARDS NOT ALLOWED. - LD A,(CHGDRV) ; REMEMBER ANY CHANGE IN DRIVES SPECIFIED. - PUSH AF - CALL DSELECT ; AND SELECT THIS DRIVE. - CALL SRCHFCB ; IS THIS FILE PRESENT? - JP NZ,RENAME6 ; YES, PRINT ERROR MESSAGE. - LD HL,#FCB ; YES, MOVE THIS NAME INTO SECOND SLOT. - LD DE,#FCB+16 - LD B,#16 - CALL HL2DE - LD HL,(INPOINT) ; GET INPUT POINTER. - EX DE,HL - CALL NONBLANK ; GET NEXT NON BLANK CHARACTER. - CP #EQUAL ; ONLY ALLOW AN '=' OR '_' SEPERATOR. - JP Z,RENAME1 - CP #ASCSPACE - JP NZ,RENAME5 -RENAME1:EX DE,HL - INC HL ; OK, SKIP SEPERATOR. - LD (INPOINT),HL ; SAVE INPUT LINE POINTER. - CALL CONVFST ; CONVERT THIS SECOND FILE NAME NOW. - JP NZ,RENAME5 ; AGAIN, NO WILD CARDS. - POP AF ; IF A DRIVE WAS SPECIFIED, THEN IT - LD B,A ; MUST BE THE SAME AS BEFORE. - LD HL,#CHGDRV - LD A,(HL) - OR A - JP Z,RENAME2 - CP B - LD (HL),B - JP NZ,RENAME5 ; THEY WERE DIFFERENT, ERROR. -RENAME2:LD (HL),B ; RESET AS PER THE FIRST FILE SPECIFICATION. - XOR A - LD (FCB),A ; CLEAR THE DRIVE BYTE OF THE FCB. -RENAME3:CALL SRCHFCB ; AND GO LOOK FOR SECOND FILE. - JP Z,RENAME4 ; DOESN'T EXIST? - LD DE,#FCB - CALL RENAM ; OK, RENAME THE FILE. - JP GETBACK -; -; PROCESS RENAME ERRORS HERE. -; -RENAME4:CALL NONE ; FILE NOT THERE. - JP GETBACK -RENAME5:CALL RESETDR ; BAD COMMAND FORMAT. - JP SYNERR -RENAME6:LD BC,#EXISTS ; DESTINATION FILE ALREADY EXISTS. - CALL PLINE - JP GETBACK -EXISTS: .asciz "File Exists" -; -;************************************************************** -;* -;* U S E R C O M M A N D -;* -;************************************************************** -; -USER: CALL DECODE ; GET NUMERIC VALUE FOLLOWING COMMAND. - CP #16 ; LEGAL USER NUMBER? - JP NC,SYNERR - LD E,A ; YES BUT IS THERE ANYTHING ELSE? - LD A,(FCB+1) - CP #ASCSPACE - JP Z,SYNERR ; YES, THAT IS NOT ALLOWED. - CALL GETSETUC ; OK, SET USER CODE. - JP GETBACK1 -; -;************************************************************** -;* -;* T R A N S I A N T P R O G R A M C O M M A N D -;* -;************************************************************** -; -UNKNOWN:LD A,(FCB+1) ; ANYTHING TO EXECUTE? - CP #ASCSPACE - JP NZ,UNKWN1 - LD A,(CHGDRV) ; NOPE, ONLY A DRIVE CHANGE? - OR A - JP Z,GETBACK1 ; NEITHER??? - DEC A - LD (CDRIVE),A ; OK, STORE NEW DRIVE. - CALL MOVECD ; SET (TDRIVE) ALSO. - CALL DSKSEL ; AND SELECT THIS DRIVE. - JP GETBACK1 ; THEN RETURN. -; -; HERE A FILE NAME WAS TYPED. PREPARE TO EXECUTE IT. -; -UNKWN1: LD DE,#FCB+9 ; AN EXTENSION SPECIFIED? - LD A,(DE) - CP #ASCSPACE - JP NZ,SYNERR ; YES, NOT ALLOWED. -UNKWN2: PUSH DE - CALL DSELECT ; SELECT SPECIFIED DRIVE. - POP DE - LD HL,#COMFILE ; SET THE EXTENSION TO 'COM'. LD HL,COMFILE - CALL MOVE3 ; move 3 bytes from (HL) to (DE) to add .COM - CALL OPENFCB ; AND OPEN THIS FILE. - JP NZ,UNKWNA ;GOT IT - .IF CHKU0B - LD E,#0 ;TRY USER 0, THIS DRIVE - CALL GETSETUC ; OK, SET USER CODE. - CALL OPENFCB - JP NZ,UNKWNA ;GOT IT - LD HL,#FCB ;SEE IF ON DRIVE B, USER 0 - LD (HL),#2 - CALL OPENFCB - JP Z,UNKWN9 ;NOPE - .ENDIF -; -; LOAD IN THE PROGRAM. -; -UNKWNA: LD HL,#TBASE ; STORE THE PROGRAM STARTING HERE. -UNKWN3: PUSH HL - EX DE,HL - CALL DMASET ; SET TRANSFER ADDRESS. - LD DE,#FCB ; AND READ THE NEXT RECORD. - CALL RDREC - JP NZ,UNKWN4 ; END OF FILE OR READ ERROR? - POP HL ; NOPE, BUMP POINTER FOR NEXT SECTOR. - LD DE,#128 - ADD HL,DE - LD DE,#CBASE ; ENOUGH ROOM FOR THE WHOLE FILE? - LD A,L - SUB E - LD A,H - SBC A,D - JP NC,UNKWN0 ; NO, IT CAN'T FIT. - JP UNKWN3 -; -; GET HERE AFTER FINISHED READING. -; -UNKWN4: POP HL - DEC A ; NORMAL END OF FILE? - JP NZ,UNKWN0 - CALL RESETDR ; YES, RESET PREVIOUS DRIVE. - CALL CONVFST ; CONVERT THE FIRST FILE NAME THAT FOLLOWS - LD HL,#CHGDRV ; COMMAND NAME. - PUSH HL - LD A,(HL) ; SET DRIVE CODE IN DEFAULT FCB. - LD (FCB),A - LD A,#16 ; PUT SECOND NAME 16 BYTES LATER. - CALL CONVERT ; CONVERT SECOND FILE NAME. - POP HL - LD A,(HL) ; AND SET THE DRIVE FOR THIS SECOND FILE. - LD (FCB+16),A - XOR A ; CLEAR RECORD BYTE IN FCB. - LD (FCB+32),A - LD DE,#TFCB ; MOVE IT INTO PLACE AT(005CH). - LD HL,#FCB - LD B,#33 - CALL HL2DE - LD HL,#INBUFF+2 ; NOW MOVE THE REMAINDER OF THE INPUT -UNKWN5: LD A,(HL) ; LINE DOWN TO (0080H). LOOK FOR A NON BLANK. - OR A ; OR A NULL. - JP Z,UNKWN6 - CP #ASCSPACE - JP Z,UNKWN6 - INC HL - JP UNKWN5 -; -; DO THE LINE MOVE NOW. IT ENDS IN A NULL BYTE. -; -UNKWN6: LD B,#0 ; KEEP A CHARACTER COUNT. - LD DE,#TBUFF+1 ; DATA GETS PUT HERE. -UNKWN7: LD A,(HL) ; MOVE IT NOW. - LD (DE),A - OR A - JP Z,UNKWN8 - INC B - INC HL - INC DE - JP UNKWN7 -UNKWN8: LD A,B ; NOW STORE THE CHARACTER COUNT. - LD (TBUFF),A - CALL CRLF ; CLEAN UP THE SCREEN. - CALL STDDMA ; SET STANDARD TRANSFER ADDRESS. - CALL SETCDRV ; RESET CURRENT DRIVE. - CALL TBASE ; AND EXECUTE THE PROGRAM. -; -; TRANSIANT PROGRAMS RETURN HERE (OR REBOOT). -; - LD SP,#BATCH ; SET STACK FIRST OFF. - CALL MOVECD ; MOVE CURRENT DRIVE INTO PLACE (TDRIVE). - CALL DSKSEL ; AND RESELECT IT. - JP CMMND1 ; BACK TO COMAND MODE. -; -; GET HERE IF SOME ERROR OCCURED. -; -UNKWN9: CALL RESETDR ; INPROPER FORMAT. - JP SYNERR -UNKWN0: LD BC,#BADLOAD ; READ ERROR OR WON'T FIT. - CALL PLINE - JP GETBACK -BADLOAD:.asciz "Bad Load" -COMFILE:.ascii "COM" ; COMMAND FILE EXTENSION. -; -; GET HERE TO RETURN TO COMMAND LEVEL. WE WILL RESET THE -; PREVIOUS ACTIVE DRIVE AND THEN EITHER RETURN TO COMMAND -; LEVEL DIRECTLY OR PRINT ERROR MESSAGE AND THEN RETURN. -; -GETBACK:CALL RESETDR ; RESET PREVIOUS DRIVE. -GETBACK1: - CALL CONVFST ; CONVERT FIRST NAME IN (FCB). - LD A,(FCB+1) ; IF THIS WAS JUST A DRIVE CHANGE R.EQUEST, - SUB #ASCSPACE ; MAKE SURE IT WAS VALID. - LD HL,#CHGDRV - OR (HL) - JP NZ,SYNERR - JP CMMND1 ; OK, RETURN TO COMMAND LEVEL. -; -; CCP STACK AREA. -; - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -CCPSTACK: -;dwg; .EQU $ ;END OF CCP STACK AREA. - -; -; BATCH (OR SUBMIT) PROCESSING INFORMATION STORAGE. -; -BATCH: .DB 0 ; BATCH MODE FLAG (0=NOT ACTIVE). -BATCHFCB:.DB 0 - .ascii "$$$ SUB" - .DB 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 -; -; FILE CONTROL BLOCK SETUP BY THE CCP. -; -FCB: .DB 0 - .asciz " " - .DB 0,0,0,0 - - .asciz " " - .DB 0,0,0,0 - -RTNCODE:.DB 0 ; STATUS RETURNED FROM BDOS CALL. -CDRIVE: .DB 0 ; CURRENTLY ACTIVE DRIVE. -CHGDRV: .DB 0 ; CHANGE IN DRIVES FLAG (0=NO CHANGE). -NBYTES: .DW 0 ; BYTE COUNTER USED BY TYPE. - -;dwg; .IF ENDFIL -;dwg; .ORG CCPO+07FFH -;dwg; .DB 055H -;dwg; .ENDIF -;dwg; .END - - -_ccp_end:: - .area _CODE - .area _CABS diff --git a/branches/dgg/cpurom/src/copyfile.c b/branches/dgg/cpurom/src/copyfile.c deleted file mode 100644 index e4b7716d..00000000 --- a/branches/dgg/cpurom/src/copyfile.c +++ /dev/null @@ -1,79 +0,0 @@ -/* - * copyfile.c 5/11/2011 dwg - - * Main C module uses cpmbdos.h bindings to access system services - * Copyright (C) Douglas Goodall All Rights Reserved - * For non-commercial use by N8VEM Community -*/ - -#include -#include -#include -#include "stdlib.h" -#include "cpmbdos.h" -#include "cprintf.h" - -char sine[] = "copyfile.c(com) 5/11/2011 dwg - $"; - -struct FCB * prifcb = (struct FCB *)0x5c; -struct FCB * secfcb = (struct FCB *)0x6c; - -struct FCB srcfcb; -struct FCB dstfcb; - -struct BDOSCALL writestr = { C_WRITESTR, { (unsigned int)&sine } }; -struct BDOSCALL makedst = { F_MAKE, { (unsigned int)&dstfcb } }; -struct BDOSCALL opensrc = { F_OPEN, { (unsigned int)&srcfcb } }; -struct BDOSCALL readsrc = { F_READ, { (unsigned int)&srcfcb } }; -struct BDOSCALL writedst = { F_WRITE, { (unsigned int)&dstfcb } }; -struct BDOSCALL closesrc = { F_CLOSE, { (unsigned int)&srcfcb } }; -struct BDOSCALL closedst = { F_CLOSE, { (unsigned int)&dstfcb } }; - -struct BDOSCALL cwrite = { C_WRITE, { (unsigned int)'?' } }; -struct BDOSCALL cread = { C_READ, { (unsigned int)0 } }; - -/* THESE ARE USED BY THE LIBRARY ROUTINES */ -char getchar(void) -{ - struct BDOSCALL cread = { C_READ, { (unsigned int)0 } }; - return cpmbdos(&cread); -} -void outchar(char c) -{ - struct BDOSCALL cwrite = { C_WRITE, { (unsigned int)c } }; - cpmbdos(&cwrite); -} - -int main(void) -{ - int rc; - - cpmbdos(&writestr); - - strncpy(srcfcb.filename,prifcb->filename,8+3); - srcfcb.ex = srcfcb.rc = srcfcb.cr = 0; - rc = cpmbdos(&opensrc); printf("\nrc from opensrc was %2d, ",rc); - if(rc != 0) { - printf("\nSorry, cannot open source file\n"); - return(EXIT_FAILURE); - } - - strncpy(dstfcb.filename,secfcb->filename,8+3); - dstfcb.ex = dstfcb.rc = dstfcb.cr = 0; - rc = cpmbdos(&makedst); printf("rc from makedst was %2d",rc); - if(rc != 0) { - printf("\nSorry, cannot open destination file\n"); - cpmbdos(&closesrc); - return(EXIT_FAILURE); - } - - rc = cpmbdos(&readsrc); printf("\nrc from read was %2d, ",rc); - while(0 == rc) { - rc = cpmbdos(&writedst); printf( "rc from write was %2d", rc); - rc = cpmbdos(&readsrc); printf("\nrc from read was %2d, ",rc); - } - rc = cpmbdos(&closesrc); printf("\nrc from closesrc was %2d, ",rc); - rc = cpmbdos(&closedst); printf( "rc from closedst was %2d", rc); - - return EXIT_SUCCESS; -} - diff --git a/branches/dgg/cpurom/src/cpm0.s b/branches/dgg/cpurom/src/cpm0.s deleted file mode 100644 index 59186c76..00000000 --- a/branches/dgg/cpurom/src/cpm0.s +++ /dev/null @@ -1,46 +0,0 @@ -;-------------------------------------------------------------------------- -; cpm0.s - Generic cpm0.s for a Z80 CP/M-80 v2.2 Application -; Copyright (C) 2011, Douglas Goodall All Rights Reserved. -;-------------------------------------------------------------------------- - - .globl _main - .area _CODE - - .ds 0x0100 -init: - ;; Define an adequate stack - ld sp,#stktop - - ;; Initialise global variables - call gsinit - - ;; Call the C main routine - call _main - - ld c,#0 - call 5 - - ;; Ordering of segments for the linker. - .area _TPA - - .area _HOME - .area _CODE - .area _GSINIT - .area _GSFINAL - .area _DATA - - .area _STACK - .ds 256 -stktop: - - .area _GSINIT -gsinit:: - - .area _GSFINAL - ret - .db 0xe5 - -;;;;;;;;;;;;;;;; -; eof - cpm0.s ; -;;;;;;;;;;;;;;;; - diff --git a/branches/dgg/cpurom/src/cpmbdos.s b/branches/dgg/cpurom/src/cpmbdos.s deleted file mode 100644 index a7c6592f..00000000 --- a/branches/dgg/cpurom/src/cpmbdos.s +++ /dev/null @@ -1,65 +0,0 @@ -;-------------------------------------------------------- -; File Created by SDCC : free open source ANSI-C Compiler -; Version 3.0.2 #6489 (May 10 2011) (Mac OS X x86_64) -; This file was generated Wed May 11 05:28:20 2011 -;-------------------------------------------------------- - .module cpmbdos - .optsdcc -mz80 - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - .globl _cpmbdos -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - .area _DATA -;-------------------------------------------------------- -; overlayable items in ram -;-------------------------------------------------------- - .area _OVERLAY -;-------------------------------------------------------- -; external initialized ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - .area _HOME - .area _GSINIT - .area _GSFINAL - .area _GSINIT -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - .area _HOME - .area _HOME -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - .area _CODE -;cpmbdos.c:1: unsigned char cpmbdos(void * p) -; --------------------------------- -; Function cpmbdos -; --------------------------------- -_cpmbdos_start:: -_cpmbdos: - push ix - ld ix,#0 - add ix,sp -;cpmbdos.c:3: return 2; - ld l,4(ix) - ld h,5(ix) - ld c,(hl) - inc hl - ld e,(hl) - inc hl - ld d,(hl) - call 5 - pop ix - ret -_cpmbdos_end:: - .area _CODE - .area _CABS diff --git a/branches/dgg/cpurom/src/cprintf.c b/branches/dgg/cpurom/src/cprintf.c deleted file mode 100644 index 7f94e9bb..00000000 --- a/branches/dgg/cpurom/src/cprintf.c +++ /dev/null @@ -1,267 +0,0 @@ -/* Copyright (C) 1996 Robert de Bath - * This file is part of the Linux-8086 C library and is distributed - * under the GNU Library General Public License. - */ - -/* Modified 14-Jan-2002 by John Coffman for inclusion - * in the set of LILO diagnostics. This code is the property of Robert - * de Bath, and is used with his permission. - */ - -/* Modified 14-Sep-2010 by John Coffman for use with - * the N8VEM SBC-188 BIOS project. - */ -#include -#include - -#undef printf -#define ASM_CVT 0 -#ifndef strlen -int strlen(char *s); -#endif - -void outchar(char ch); -#define putch(ch) outchar((char)ch) - - -#ifndef NULL -# define NULL ((void*)0L) -#endif - -#define __fastcall -#define NUMLTH 11 -static unsigned char * __fastcall __numout(long i, int base, unsigned char out[]); - -int cprintf(const char * fmt, ...) -{ - register int c; - int count = 0; - int type, base; - long val; - char * cp; - char padch=' '; - int minsize, maxsize; - unsigned char out[NUMLTH+1]; - va_list ap; - - va_start(ap, fmt); - - while(c=*fmt++) - { - count++; - if(c!='%') - { - if (c=='\n') putch('\r'); - putch(c); - } - else - { - type=1; - padch = *fmt; - maxsize=minsize=0; - if(padch == '-') fmt++; - - for(;;) - { - c=*fmt++; - if( c<'0' || c>'9' ) break; - minsize*=10; minsize+=c-'0'; - } - - if( c == '.' ) - for(;;) - { - c=*fmt++; - if( c<'0' || c>'9' ) break; - maxsize*=10; maxsize+=c-'0'; - } - - if( padch == '-' ) minsize = -minsize; - else - if( padch != '0' ) padch=' '; - - if( c == 0 ) break; - if(c=='h') - { - c=*fmt++; - type = 0; - } - else if(c=='l') - { - c=*fmt++; - type = 2; - } - - switch(c) - { - case 'X': - case 'x': base=16; type |= 4; if(0) { - case 'o': base= 8; type |= 4; } if(0) { - case 'u': base=10; type |= 4; } if(0) { - case 'd': base=-10; } - switch(type) - { - case 0: val=va_arg(ap, short); break; - case 1: val=va_arg(ap, int); break; - case 2: val=va_arg(ap, long); break; - case 4: val=va_arg(ap, unsigned short); break; - case 5: val=va_arg(ap, unsigned int); break; - case 6: val=va_arg(ap, unsigned long); break; - default:val=0; break; - } - cp = __numout(val,base,out); - if(0) { - case 's': - cp=va_arg(ap, char *); - } - count--; - c = strlen(cp); - if( !maxsize ) maxsize = c; - if( minsize > 0 ) - { - minsize -= c; - while(minsize>0) { putch(padch); count++; minsize--; } - minsize=0; - } - if( minsize < 0 ) minsize= -minsize-c; - while(*cp && maxsize-->0 ) - { - putch(*cp++); - count++; - } - while(minsize>0) { putch(' '); count++; minsize--; } - break; - case 'c': - putch(va_arg(ap, int)); - break; - default: - putch(c); - break; - } - } - } - va_end(ap); - return count; -} - -const char nstring[]="0123456789ABCDEF"; - -#if ASM_CVT==0 - -static unsigned char * -__fastcall -__numout(long i, int base, unsigned char *out) -{ - int n; - int flg = 0; - unsigned long val; - - if (base<0) - { - base = -base; - if (i<0) - { - flg = 1; - i = -i; - } - } - val = i; - - out[NUMLTH] = '\0'; - n = NUMLTH-1; - do - { -#if 1 - out[n] = nstring[val % base]; - val /= base; - --n; -#else - out[n--] = nstring[remLS(val,base)]; - val = divLS(val,base); -#endif - } - while(val); - if(flg) out[n--] = '-'; - - return &out[n+1]; -} -#else - -#asm -! numout.s -! -#if 0 -.data -_nstring: -.ascii "0123456789ABCDEF" -.byte 0 -#endif - -.bss -___out lcomm $C - -.text -___numout: -push bp -mov bp,sp -push di -push si -add sp,*-4 -mov byte ptr -8[bp],*$0 ! flg = 0 -mov si,4[bp] ; i or val.lo -mov di,6[bp] ; i or val.hi -mov cx,8[bp] ; base -test cx,cx ! base < 0 ? -jge .3num -neg cx ! base = -base -or di,di ! i < 0 ? -jns .5num -mov byte ptr -8[bp],*1 ! flg = 1 -neg di ! i = -i -neg si -sbb di,*0 -.5num: -.3num: -mov byte ptr [___out+$B],*$0 ! out[11] = nul -mov -6[bp],*$A ! n = 10 - -.9num: -!!! out[n--] = nstring[val % base]; -xor dx,dx -xchg ax,di -div cx -xchg ax,di -xchg ax,si -div cx -xchg ax,si ! val(new) = val / base - -mov bx,dx ! dx = val % base - -mov al,_nstring[bx] -mov bx,-6[bp] -dec word ptr -6[bp] -mov ___out[bx],al - -mov ax,si -or ax,di ! while (val) -jne .9num - -cmp byte ptr -8[bp],*$0 ! flg == 0 ? -je .Dnum - -mov bx,-6[bp] -dec word ptr -6[bp] -mov byte ptr ___out[bx],*$2D ! out[n--] = minus - -.Dnum: -mov ax,-6[bp] -add ax,#___out+1 - -add sp,*4 -pop si -pop di -pop bp -ret -#endasm - -#endif diff --git a/branches/dgg/cpurom/src/crt0.s b/branches/dgg/cpurom/src/crt0.s deleted file mode 100644 index cd5212df..00000000 --- a/branches/dgg/cpurom/src/crt0.s +++ /dev/null @@ -1,97 +0,0 @@ -; modified 4/22/2011 for the N8VEM Home Computer Z180 -- John Coffman -; -;-------------------------------------------------------------------------- -; crt0.s - Generic crt0.s for a Z80 -; -; Copyright (C) 2000, Michael Hope -; -; This library is free software; you can redistribute it and/or modify it -; under the terms of the GNU General Public License as published by the -; Free Software Foundation; either version 2.1, or (at your option) any -; later version. -; -; This library is distributed in the hope that it will be useful, -; but WITHOUT ANY WARRANTY; without even the implied warranty of -; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -; GNU General Public License for more details. -; -; You should have received a copy of the GNU General Public License -; along with this library; see the file COPYING. If not, write to the -; Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, -; MA 02110-1301, USA. -; -; As a special exception, if you link this library with other files, -; some of which are compiled with SDCC, to produce an executable, -; this library does not by itself cause the resulting executable to -; be covered by the GNU General Public License. This exception does -; not however invalidate any other reasons why the executable file -; might be covered by the GNU General Public License. -;-------------------------------------------------------------------------- - -;;; .module crt0 - .globl _main - - .area _HEADER (ABS) - ;; Reset vector - .org 0 - jp init - - .org 0x08 - ret - .org 0x10 - ret - .org 0x18 - ret - .org 0x20 - ret - .org 0x28 - ret - .org 0x30 - ret - .org 0x38 - ret - .org 0x66 ; NMI interrupt - retn - - .org 0x100 -init: - ;; Stack at the top of memory. - ld sp,#0xffff - - ;; Initialise global variables - call gsinit - call _main - jp _exit - - ;; Ordering of segments for the linker. - .area _HOME - .area _CODE - .area _GSINIT - .area _GSFINAL - - .area _DATA - .area _BSEG - .area _BSS - .area _HEAP - - .area _CODE -.if 0 -__clock:: - ld a,#2 - rst 0x08 - ret -.endif - -_exit:: - ;; Exit - special code to the emulator - ld a,#0 - rst 0x08 -1$: - halt - jr 1$ - - .area _GSINIT -gsinit:: - - .area _GSFINAL - ret diff --git a/branches/dgg/cpurom/src/crt0jplp.s b/branches/dgg/cpurom/src/crt0jplp.s deleted file mode 100644 index 41005105..00000000 --- a/branches/dgg/cpurom/src/crt0jplp.s +++ /dev/null @@ -1,9 +0,0 @@ -;-------------------------------------------------------------------------- -; crt0jplp.s 8/7/2011 dwg - - Generic crt0.s for a Z80 with jump loop -;-------------------------------------------------------------------------- - - .area _HEADER (ABS) - .org 0 -jploop: jp jploop - - diff --git a/branches/dgg/cpurom/src/crt0scrm.s b/branches/dgg/cpurom/src/crt0scrm.s deleted file mode 100644 index b787bde5..00000000 --- a/branches/dgg/cpurom/src/crt0scrm.s +++ /dev/null @@ -1,44 +0,0 @@ -;-------------------------------------------------------------------------- -; crt0scrm.s 8/7/2011 dwg - - Generic crt0.s for a Z80 with jump loop -;-------------------------------------------------------------------------- - - - .area _HEADER (ABS) - .org 0 - - .include "scsi2ide.inc" - .include "ns16550.inc" - -scream: - - ld a,#UART_DLAB - out (wUART_LCR),a - - ld a,#0x00 - out (wUART_DIV_HI),a - - ld a,#UART_BAUD_9600 - out (wUART_DIV_LO),a - - ld a,#0 - out (wUART_LCR),a - - ld a,#0x03 - out (wUART_LCR),a - - ld a,#0x03 - out (wUART_MCR),a - -scrmlp: - in a,(rUART_LSR) - and a,#UART_TBE - jp z,scrmlp - - ld a,#0x30 ; ascii 0 (zero) - out (wUART_TDR),a - - jp scrmlp - - - - diff --git a/branches/dgg/cpurom/src/dbgmon.s b/branches/dgg/cpurom/src/dbgmon.s deleted file mode 100644 index b39b1a84..00000000 --- a/branches/dgg/cpurom/src/dbgmon.s +++ /dev/null @@ -1,1764 +0,0 @@ - .title dbgmon.s derived from dbgmon.asm - .sbttl Ported by Douglas Goodall - - .module dbgmon - .optsdcc -mz80 - -;-------------------------------------------------------- -; Public variables in this module -;-------------------------------------------------------- - .globl _dbgmon -;-------------------------------------------------------- -; special function registers -;-------------------------------------------------------- -;-------------------------------------------------------- -; ram data -;-------------------------------------------------------- - .area _DATA -;-------------------------------------------------------- -; overlayable items in ram -;-------------------------------------------------------- - .area _OVERLAY -;-------------------------------------------------------- -; external initialized ram data -;-------------------------------------------------------- -;-------------------------------------------------------- -; global & static initialisations -;-------------------------------------------------------- - .area _HOME - .area _GSINIT - .area _GSFINAL - .area _GSINIT -;-------------------------------------------------------- -; Home -;-------------------------------------------------------- - .area _HOME - .area _HOME -;-------------------------------------------------------- -; code -;-------------------------------------------------------- - .area _DBGMON -_dbgmon_start:: -_dbgmon: - - -;___ROM_MONITOR_PROGRAM_____________________________________________________________________________________________________________ -; -; ORIGINAL CODE BY: ANDREW LYNCH (LYNCHAJ@YAHOO COM) 13 FEB 2007 -; -; MODIFIED BY : DAN WERNER 03 09.2009 -; -;__REFERENCES________________________________________________________________________________________________________________________ -; THOMAS SCHERRER BASIC HAR.DWARE TEST ASSEMBLER SOURCES FROM THE Z80 INFO PAGE -; INCLUDING ORIGINAL SCHEMATIC CONCEPT -; HTTP://Z80 INFO/Z80SOURC.TXT -; CODE SAMPLES FROM BRUCE JONES PUBLIC DOMAIN ROM MONITOR FOR THE SBC-200C -; HTTP://WWW RETROTECHNOLOGY.COM/HERBS_STUFF/SD_BRUCE_CODE.ZIP -; INSPIRATION FROM JOEL OWENS "Z-80 SPACE-TIME PRODUCTIONS SINGLE BOARD COMPUTER" -; HTTP://WWW JOELOWENS.ORG/Z80/Z80INDEX.HTML -; GREAT HELP AND TECHNICAL ADVICE FROM ALLISON AT ALPACA_DESIGNERS -; HTTP://GROUPS YAHOO.COM/GROUP/ALPACA_DESIGNERS -; INTEL SDK-85 ROM DEBUG MONITOR -; -;__HARDWARE_INTERFACES________________________________________________________________________________________________________________ -; -; PIO 82C55 I/O IS DECODED TO PORT 60-67 -; -PORTA = 0x60 -PORTB = 0x61 -PORTC = 0x62 -PIOCONT = 0x63 -; -; UART 16C450 SERIAL IS DECODED TO 68-6F -; -UART0 = 0x68 ; DATA IN/OUT -UART1 = 0x69 ; CHECK RX -UART2 = 0x6A ; INTERRUPTS -UART3 = 0x6B ; LINE CONTROL -UART4 = 0x6C ; MODEM CONTROL -UART5 = 0x6D ; LINE STATUS -UART6 = 0x6E ; MODEM STATUS -UART7 = 0x6F ; SCRATCH REG. -; -; MEMORY PAGE CONFIGURATION LATCH IS DECODED TO 78 -; -MPCL = 0x78 ; CONTROL PORT, SHOULD ONLY BE CHANGED WHILE -; IN UPPER MEMORY PAGE 08000h-$FFFF OR LIKELY -MPCL_RAM = 0x78 ; BASE IO ADDRESS OF RAM MEMORY PAGER CONFIGURATION LATCH -MPCL_ROM = 0x7C ; BASE IO ADDRESS OF ROM MEMORY PAGER CONFIGURATION LATCH -; LOSS OF CPU MEMORY CONTEXT -; -; MEMORY PAGE CONFIGURATION LATCH CONTROL PORT ( IO_Y3 ) INFORMATION -; -; 7 6 5 4 3 2 1 0 ONLY APPLICABLE TO THE LOWER MEMORY PAGE 00000h-$7FFF -; ^ ^ ^ ^ ^ ^ ^ ^ -; : : : : : : : :--0 = A15 RAM/ROM ADDRESS LINE DEFAULT IS 0 -; : : : : : : :----0 = A16 RAM/ROM ADDRESS LINE DEFAULT IS 0 -; : : : : : :------0 = A17 RAM/ROM ADDRESS LINE DEFAULT IS 0 -; : : : : :--------0 = A18 RAM/ROM ADDRESS LINE DEFAULT IS 0 -; : : : :-----------0 = A19 ROM ONLY ADDRESS LINE DEFAULT IS 0 -; : : :-------------0 = -; : :---------------0 = -; :-----------------0 = ROM SELECT (0=ROM, 1=RAM) DEFAULT IS 0 -; -; -;IDE REGISTER IO PORT ; FUNCTION -IDELO = 0x020 ; DATA PORT (LOW BYTE) -IDEERR = 0x021 ; READ: ERROR REGISTER; WRITE: PRECOMP -IDESECTC = 0x022 ; SECTOR COUNT -IDESECTN = 0x023 ; SECTOR NUMBER -IDECYLLO = 0x024 ; CYLINDER LOW -IDECYLHI = 0x025 ; CYLINDER HIGH -IDEHEAD = 0x026 ; DRIVE/HEAD -IDESTTS = 0x027 ; READ: STATUS; WRITE: COMMAND -IDEHI = 0x028 ; DATA PORT (HIGH BYTE) -IDECTRL = 0x02E ; READ: ALTERNATIVE STATUS; WRITE; DEVICE CONTROL -IDEADDR = 0x02F ; DRIVE ADDRESS (READ ONLY) - -; -; -;__CONSTANTS_________________________________________________________________________________________________________________________ -; -RAMTOP = 0x0FFFF ; HIGHEST ADDRESSABLE MEMORY LOCATION -STACKSTART = 0x0CFFF ; START OF STACK -RAMBOTTOM = 0x08000 ; START OF FIXED UPPER 32K PAGE OF 512KB X 8 RAM 8000H-FFFFH -MONSTARTCOLD = 0x08000 ; COLD START MONITOR IN HIGH RAM -ENDT = 0x0FF ; MARK END OF TEXT -CR = 0x0D ; ASCII CARRIAGE RETURN CHARACTER -LF = 0x0A ; ASCII LINE FEED CHARACTER -ESC = 0x1B ; ASCII ESCAPE CHARACTER -BS = 0x08 ; ASCII BACKSPACE CHARACTER - -ASCIIA = 0x41 -ASCIIB = 0x42 -ASCIIC = 0x43 -ASCIID = 0x44 -ASCIIE = 0x45 -ASCIIF = 0x46 -ASCIIG = 0x47 -ASCIIH = 0x48 -ASCIII = 0x49 -ASCIIJ = 0x4A -ASCIIK = 0x4B -ASCIIL = 0x4C -ASCIIM = 0x4D -ASCIIN = 0x4E -ASCIIO = 0x4F -ASCIIP = 0x50 -ASCIIQ = 0x51 -ASCIIR = 0x52 -ASCIIS = 0x53 -ASCIIT = 0x54 -ASCIIU = 0x55 -ASCIIV = 0x56 -ASCIIW = 0x57 -ASCIIX = 0x58 -ASCIIY = 0x59 -ASCIIZ = 0x5A - -; -; -; -;__MAIN_PROGRAM_____________________________________________________________________________________________________________________ -; -; ORG 00100h ; FOR DEBUG IN CP/M (AS .COM) - -;dwg; .ORG 8000H ; NORMAL OP - - LD SP,#STACKSTART ; SET THE STACK POINTER TO STACKSTART - CALL INITIALIZE ; INITIALIZE SYSTEM - - - -;__FRONT_PANEL_STARTUP___________________________________________________________________________________________________________ -; -; START UP THE SYSTEM WITH THE FRONT PANEL INTERFACE -; -;________________________________________________________________________________________________________________________________ -; - CALL MTERM_INIT ; INIT 8255 FOR MTERM - LD HL,#CPUUP ; SET POINTER TO DATA BUFFER - CALL SEGDISPLAY ; DISPLAY - - - -FRONTPANELLOOP: - CALL KB_GET ; GET KEY FROM KB - - CP #0x10 ; IS PORT READ? - JP Z,DOPORTREAD ; YES, JUMP - CP #0x11 ; IS PORT WRITE? - JP Z,DOPORTWRITE ; YES, JUMP - CP #0x14 ; IS DEPOSIT? - JP Z,DODEPOSIT ; YES, JUMP - CP #0x15 ; IS EXAMINE? - JP Z,DOEXAMINE ; YES, JUMP - CP #0x16 ; IS GO? - JP Z,DOGO ; YES, JUMP - CP #0x17 ; IS BO? - JP Z,DOBOOT ; YES, JUMP - - JR FRONTPANELLOOP ; LOOP -EXIT: - RET - - -;__DOBOOT________________________________________________________________________________________________________________________ -; -; PERFORM BOOT FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ -; -DOBOOT: - LD A,#0 ; LOAD VALUE TO SWITCH OUT ROM - OUT (MPCL_ROM),A ; SWITCH OUT ROM, BRING IN LOWER 32K RAM PAGE - ; - ; - OUT (MPCL_RAM),A ; - JP 0 ; GO TO CP/M - - -;__DOPORTREAD____________________________________________________________________________________________________________________ -; -; PERFORM PORT READ FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ -; -DOPORTREAD: - CALL GETPORT ; GET PORT INTO A -PORTREADLOOP: - LD C,A ; STORE PORT IN "C" - SRL A ; ROTATE HIGH NIB TO LOW - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; SHOW HIGH NIB IN DISP 5 - LD A,C ; RESTORE PORT VALUE INTO "A" - AND #0x0F ; CLEAR HIGH NIB, LEAVING LOW - LD (DISPLAYBUF+4),A ; SHOW LOW NIB IN DISP 4 - IN A,(C) ; GET PORT VALUE FROM PORT IN "C" - LD C,A ; STORE VALUE IN "C" - SRL A ; ROTATE HIGH NIB TO LOW - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+1),A ; SHOW HIGH NIB IN DISP 1 - LD A,C ; RESTORE VALUE TO "A" - AND #0x0F ; CLEAR HIGH NIB, LEAVING LOW - LD (DISPLAYBUF),A ; DISPLAY LOW NIB IN DISP 0 - LD A,#0x10 ; CLEAR OTHER DISPLAYS - LD (DISPLAYBUF+2),A ; - LD (DISPLAYBUF+3),A ; - LD A,#0x13 ; "P" - LD (DISPLAYBUF+7),A ; STORE IN DISP 7 - LD A,#0x14 ; "O" - LD (DISPLAYBUF+6),A ; STORE IN DISP 6 - LD HL,#DISPLAYBUF ; SET POINTER TO DISPLAY BUFFER - CALL HEXDISPLAY ; DISPLAY BUFFER CONTENTS -PORTREADGETKEY: - CALL KB_GET ; GET KEY FROM KB - CP #0x12 ; [CL] PRESSED, EXIT - JP Z,PORTREADEXIT ; - CP #0x10 ; [PR] PRESSED, PROMPT FOR NEW PORT - JR Z,DOPORTREAD ; - JR PORTREADGETKEY ; NO VALID KEY, LOOP -PORTREADEXIT: - LD HL,#CPUUP ; SET POINTER TO DATA BUFFER - CALL SEGDISPLAY ; DISPLAY - JP FRONTPANELLOOP ; - -;__DOPORTWRITE____________________________________________________________________________________________________________________ -; -; PERFORM PORT WRITE FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ -; -DOPORTWRITE: - CALL GETPORT ; GET PORT INTO A -PORTWRITELOOP: - LD C,A ; STORE PORT IN "C" - SRL A ; ROTATE HIGH NIB INTO LOW - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; DISPLAY HIGH NIB IN DISPLAY 5 - LD A,C ; RESTORE PORT VALUE INTO "A" - AND #0x0F ; CLEAR OUT HIGH NIB - LD (DISPLAYBUF+4),A ; DISPLAY LOW NIB IN DISPLAY 4 - LD A,#0x10 ; CLEAR OUT DISPLAYS 2 AND 3 - LD (DISPLAYBUF+2),A ; - LD (DISPLAYBUF+3),A ; - LD A,#0x13 ; DISPLAY "P" IN DISP 7 - LD (DISPLAYBUF+7),A ; - LD A,#0x14 ; DISPLAY "O" IN DISP 6 - LD (DISPLAYBUF+6),A ; - LD HL,#DISPLAYBUF ; POINT TO DISPLAY BUFFER - CALL GETVALUE ; INPUT A BYTE VALUE, RETURN IN "A" - OUT (C),A ; OUTPUT VALUE TO PORT STORED IN "C" - LD HL,#CPUUP ; SET POINTER TO DATA BUFFER - CALL SEGDISPLAY ; DISPLAY - JP FRONTPANELLOOP ; - - -;__DOGO__________________________________________________________________________________________________________________________ -; -; PERFORM GO FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ -; -DOGO: - CALL GETADDR ; GET ADDRESS INTO HL - JP (HL) ; GO THERE! - - - -;__DODEPOSIT________________________________________________________________________________________________________________________ -; -; PERFORM DEPOSIT FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ -; -DODEPOSIT: - CALL GETADDR ; GET ADDRESS INTO HL - PUSH HL -DEPOSITLOOP: - LD A,H ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+7),A ; - LD A,H ; - AND #0x0F ; - LD (DISPLAYBUF+6),A ; - LD A,L ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; - LD A,L ; - AND #0x0F ; - LD (DISPLAYBUF+4),A ; - LD A,#0x10 ; - LD (DISPLAYBUF+3),A ; - LD HL,#DISPLAYBUF ; - CALL GETVALUE ; - POP HL ; - LD (HL),A ; -DEPOSITGETKEY: - CALL KB_GET ; GET KEY FROM KB - CP #0x12 ; [CL] PRESSED, EXIT - JP Z,DEPOSITEXIT ; - CP #0x13 ; [EN] PRESSED, INC ADDRESS AND LOOP - JR Z,DEPOSITFW ; - CP #0x14 ; [DE] PRESSED, PROMPT FOR NEW ADDRESS - JR Z,DODEPOSIT ; - JR DEPOSITGETKEY ; NO VALID KEY, LOOP -DEPOSITFW: - INC HL ; - PUSH HL ; STORE HL - JR DEPOSITLOOP ; -DEPOSITEXIT: - LD HL,#CPUUP ; SET POINTER TO DATA BUFFER - CALL SEGDISPLAY ; DISPLAY - JP FRONTPANELLOOP ; - - - - -;__DOEXAMINE________________________________________________________________________________________________________________________ -; -; PERFORM EXAMINE FRONT PANEL ACTION -;________________________________________________________________________________________________________________________________ -; -DOEXAMINE: - CALL GETADDR ; GET ADDRESS INTO HL - PUSH HL ; STORE HL -EXAMINELOOP: - LD A,H ; MOVE HIGH BYTE IN "A" - SRL A ; SHOW HIGH NIBBLE IN DISP 7 - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+7),A ; - LD A,H ; RESTORE HIGH BYTE - AND #0x0F ; CLEAR HIGH NIBBLE - LD (DISPLAYBUF+6),A ; DISPLAY LOW NIBBLE IN DISP 6 - LD A,L ; PUT LOW BYTE IN "A" - SRL A ; SHOW HIGH NIBBLE IN DISP 5 - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+5),A ; - LD A,L ; RESTORE LOW BYTE IN "A" - AND #0x0F ; CLEAR OUT HIGH NIBBLE - LD (DISPLAYBUF+4),A ; DISPLAY LOW NIBBLE IN DISP 4 - LD A,#0x10 ; CLEAR OUT DISP 3 - LD (DISPLAYBUF+3),A ; - LD A,(HL) ; GET VALUE FROM ADDRESS IN HL - SRL A ; DISPLAY HIGH NIB IN DISPLAY 1 - SRL A ; - SRL A ; - SRL A ; - LD (DISPLAYBUF+1),A ; - LD A,(HL) ; GET VALUE FROM ADDRESS IN HL - AND #0x0F ; CLEAR OUT HIGH NIBBLE - LD (DISPLAYBUF),A ; DISPLAY LOW NIBBLE IN DISPLAY 0 - LD HL,#DISPLAYBUF ; POINT TO DISPLAY BUFFER - CALL HEXDISPLAY ; DISPLAY BUFFER ON DISPLAYS - POP HL ; RESTORE HL -EXAMINEGETKEY: - CALL KB_GET ; GET KEY FROM KB - CP #0x12 ; [CL] PRESSED, EXIT - JP Z,EXAMINEEXIT ; - CP #0x13 ; [EN] PRESSED, INC ADDRESS AND LOOP - JR Z,EXAMINEFW ; - CP #0x15 ; [DE] PRESSED, PROMPT FOR NEW ADDRESS - JR Z,DOEXAMINE ; - JR EXAMINEGETKEY ; NO VALID KEY, LOOP -EXAMINEFW: - INC HL ; HL++ - PUSH HL ; STORE HL - JR EXAMINELOOP ; -EXAMINEEXIT: - LD HL,#CPUUP ; SET POINTER TO DATA BUFFER - CALL SEGDISPLAY ; DISPLAY - JP FRONTPANELLOOP ; - - -;__GETADDR_______________________________________________________________________________________________________________________ -; -; GET ADDRESS FROM FRONT PANEL -;________________________________________________________________________________________________________________________________ -; -GETADDR: - PUSH BC ; STORE BC - JR GETADDRCLEAR ; -GETADDR1: - LD HL,#ADDR ; DISPLAY PROMPT - CALL SEGDISPLAY ; -GETADDRLOOP: - CALL KB_GET ; - CP #0x10 ; - JP M,GETADDRNUM ; NUMBER PRESSED, STORE IT - CP #0x13 ; EN PRESSED, DONE - JR Z,GETADDRDONE ; - CP #0x12 ; CLEAR PRESSED, CLEAR - JR Z,GETADDRCLEAR ; - JR GETADDRLOOP ; INVALID KEY, LOOP -GETADDRDONE: - LD HL,#0 ; HL=0 - LD A,(DISPLAYBUF+1) ; GET DIGIT IN DISPLAY 1 - SLA A ; ROTATE IT TO HIGH NIBBLE - SLA A ; - SLA A ; - SLA A ; - LD C,A ; STORE IT IN "C" - LD A,(DISPLAYBUF) ; GET DIGIT IN DISPLAY 0 - AND #0x0F ; CLEAR HIGH NIBBLE - OR C ; ADD IN NIBBLE STORED IN C - LD L,A ; STORE IT IN LOW BYTE OF ADDRESS POINTER - LD A,(DISPLAYBUF+3) ; GET DIGIT IN DISPLAY 3 - SLA A ; ROTATE IT TO HIGH NIBBLE - SLA A ; - SLA A ; - SLA A ; - LD C,A ; STORE IT IN "C" - LD A,(DISPLAYBUF+2) ; GET DIGIT IN DISPLAY 2 - AND #0x0F ; CLEAR HIGH NIBBLE - OR C ; ADD IN NIBBLE STORED IN "C" - LD H,A ; STORE BYTE IN HIGH BYTE OF ADDRESS POINTER - LD A,#0x10 ; CLEAR OUT DISPLAYS 0,1,2 & 3 - LD (DISPLAYBUF),A ; - LD (DISPLAYBUF+1),A ; - LD (DISPLAYBUF+2),A ; - LD (DISPLAYBUF+3),A ; - POP BC ; RESTORE BC - RET -GETADDRNUM: - LD C,A ; - LD A,(DISPLAYBUF+2) ; SHIFT BYTES IN DISPLAY BUF TO THE LEFT - LD (DISPLAYBUF+3),A ; - LD A,(DISPLAYBUF+1) ; - LD (DISPLAYBUF+2),A ; - LD A,(DISPLAYBUF) ; - LD (DISPLAYBUF+1),A ; - LD A,C ; DISPLAY KEYSTROKE IN RIGHT MOST DISPLAY (0) - LD (DISPLAYBUF+0),A ; - JR GETADDRDISP ; -GETADDRCLEAR: - LD A,#0x12 ; CLEAR OUT DISPLAYS 0,1,2 & 3 - LD (DISPLAYBUF),A ; - LD (DISPLAYBUF+1),A ; - LD (DISPLAYBUF+2),A ; - LD (DISPLAYBUF+3),A ; -GETADDRDISP: - LD A,(DISPLAYBUF) ; ENCODE DIGITS IN DISPLAY BUFFER TO DISPLAY - CALL DECODEDISPLAY ; - LD (ADDR),A ; - LD A,(DISPLAYBUF+1) ; - CALL DECODEDISPLAY ; - LD (ADDR+1),A ; - LD A,(DISPLAYBUF+2) ; - CALL DECODEDISPLAY ; - LD (ADDR+2),A ; - LD A,(DISPLAYBUF+3) ; - CALL DECODEDISPLAY ; - LD (ADDR+3),A ; - JP GETADDR1 ; - - - -;__DSPSECTOR_______________________________________________________________________________________________________________________ -; -; DISPLAY SECTOR IN HL ON FRONT PANEL -;________________________________________________________________________________________________________________________________ -; -DSPSECTOR: - PUSH BC ; STORE BC - PUSH HL ; STORE HL - LD A,H ; DISPLAY HIGH BYTE, HIGH NIBBLE - SRL A ; - SRL A ; - SRL A ; - SRL A ; - AND #0x0F ; - CALL DECODEDISPLAY ; - LD (SEC+3),A ; - LD A,H ; DISPLAY HIGH BYTE, LOW NIBBLE - AND #0x0F ; - CALL DECODEDISPLAY ; - LD (SEC+2),A ; - LD A,L ; DISPLAY LOW BYTE, HIGH NIBBLE - AND #0x0F0 ; - SRL A ; - SRL A ; - SRL A ; - SRL A ; - AND #0x0F ; - CALL DECODEDISPLAY ; - LD (SEC+1),A ; DISPLAY LOW BYTE, LOW NIBBLE - LD A,L ; - AND #0x0F ; - CALL DECODEDISPLAY ; - LD (SEC),A ; - LD HL,#SEC ; DISPLAY PROMPT - CALL SEGDISPLAY ; - POP HL ; RESTORE HL - POP BC ; RESTORE BC - RET - - - -;__GETPORT_______________________________________________________________________________________________________________________ -; -; GET PORT FROM FRONT PANEL -;________________________________________________________________________________________________________________________________ -; -GETPORT: - PUSH BC ; STORE BC - JR GETPORTCLEAR ; -GETPORT1: - LD HL,#PORT ; DISPLAY PROMPT - CALL SEGDISPLAY ; -GETPORTLOOP: - CALL KB_GET ; - CP #0x10 ; - JP M,GETPORTNUM ; NUMBER PRESSED, STORE IT - CP #0x13 ; EN PRESSED, DONE - JR Z,GETPORTDONE ; - CP #0x12 ; CLEAR PRESSED, CLEAR - JR Z,GETPORTCLEAR ; - JR GETPORTLOOP ; INVALID KEY, LOOP -GETPORTDONE: - LD A,(DISPLAYBUF+1) ; - SLA A ; - SLA A ; - SLA A ; - SLA A ; - LD C,A ; - LD A,(DISPLAYBUF) ; - AND #0x0F ; - OR C ; - LD C,A ; - LD A,#0x10 ; - LD (DISPLAYBUF),A ; - LD (DISPLAYBUF+1),A ; - LD A,C ; - POP BC ; RESTORE BC - RET -GETPORTNUM: - LD C,A ; - LD A,(DISPLAYBUF) ; - LD (DISPLAYBUF+1),A ; - LD A,C ; - LD (DISPLAYBUF+0),A ; - JR GETPORTDISP ; -GETPORTCLEAR: - LD A,#0x12 ; - LD (DISPLAYBUF),A ; - LD (DISPLAYBUF+1),A ; -GETPORTDISP: - LD A,(DISPLAYBUF) ; - CALL DECODEDISPLAY ; - LD (PORT),A ; - LD A,(DISPLAYBUF+1) ; - CALL DECODEDISPLAY ; - LD (PORT+1),A ; - JP GETPORT1 ; - - -;__GETVALUE______________________________________________________________________________________________________________________ -; -; GET VALUE FROM FRONT PANEL -;________________________________________________________________________________________________________________________________ -; -GETVALUE: - PUSH BC ; STORE BC - JR GETVALUECLEAR ; -GETVALUE1: - CALL HEXDISPLAY ; - -GETVALUELOOP: - CALL KB_GET ; - CP #0x10 ; - JP M,GETVALUENUM ; NUMBER PRESSED, STORE IT - CP #0x13 ; EN PRESSED, DONE - JR Z,GETVALUEDONE ; - CP #0x12 ; CLEAR PRESSED, CLEAR - JR Z,GETVALUECLEAR ; - JR GETVALUELOOP ; INVALID KEY, LOOP -GETVALUEDONE: - LD A,(DISPLAYBUF+1) ; - SLA A ; - SLA A ; - SLA A ; - SLA A ; - LD C,A ; - LD A,(DISPLAYBUF) ; - AND #0x0F ; - OR C ; - LD C,A ; - LD A,#0x10 ; - LD (DISPLAYBUF),A ; - LD (DISPLAYBUF+1),A ; - LD A,C ; - POP BC ; RESTORE BC - RET -GETVALUENUM: - LD C,A ; - LD A,(DISPLAYBUF) ; - LD (DISPLAYBUF+1),A ; - LD A,C ; - LD (DISPLAYBUF+0),A ; - JR GETVALUE1 ; -GETVALUECLEAR: - LD A,#0x12 ; - LD (DISPLAYBUF),A ; - LD (DISPLAYBUF+1),A ; - JP GETVALUE1 ; - - -;__MONSTARTWARM___________________________________________________________________________________________________________________ -; -; SERIAL MONITOR STARTUP -;________________________________________________________________________________________________________________________________ -; - -MONSTARTWARM: ; CALL HERE FOR SERIAL MONITOR WARM START - LD SP,#STACKSTART ; SET THE STACK POINTER TO STACKSTART - CALL INITIALIZE ; INITIALIZE SYSTEM - - XOR A ;ZERO OUT ACCUMULATOR (ADDED) - PUSH HL ;PROTECT HL FROM OVERWRITE - LD HL,#TXT_READY ;POINT AT TEXT - CALL MSG ;SHOW WE'RE HERE - POP HL ;PROTECT HL FROM OVERWRITE - -; -;__SERIAL_MONITOR_COMMANDS_________________________________________________________________________________________________________ -; -; B XX BOOT CPM FROM DRIVE XX -; D XXXXH YYYYH DUMP MEMORY FROM XXXX TO YYYY -; F XXXXH YYYYH ZZH FILL MEMORY FROM XXXX TO YYYY WITH ZZ -; H LOAD INTEL HEX FORMAT DATA -; I INPUT FROM PORT AND SHOW HEX DATA -; K ECHO KEYBOARD INPUT -; M XXXXH YYYYH ZZZZH MOVE MEMORY BLOCK XXXX TO YYYY TO ZZZZ -; O OUTPUT TO PORT HEX DATA -; P XXXXH YYH PROGRAM RAM FROM XXXXH WITH VALUE IN YYH, WILL PROMPT FOR NEXT LINES FOLLOWING UNTIL CR -; R RUN A PROGRAM FROM CURRENT LOCATION - - - -;__COMMAND_PARSE_________________________________________________________________________________________________________________ -; -; PROMPT USER FOR COMMANDS, THEN PARSE THEM -;________________________________________________________________________________________________________________________________ -; - -SERIALCMDLOOP: - CALL CRLFA ; CR,LF,> - LD HL,#KEYBUF ; SET POINTER TO KEYBUF AREA - CALL GETLN ; GET A LINE OF INPUT FROM THE USER - LD HL,#KEYBUF ; RESET POINTER TO START OF KEYBUF - LD A,(HL) ; LOAD FIRST CHAR INTO A (THIS SHOULD BE THE COMMAND) - INC HL ; INC POINTER - - CP #ASCIIB ; IS IT "B" (Y/N) - JP Z,DOBOOT ; IF YES DO BOOT - CP #ASCIIR ; IS IT "R" (Y/N) - JP Z,RUN ; IF YES GO RUN ROUTINE - CP #ASCIIP ; IS IT "P" (Y/N) - JP Z,PROGRM ; IF YES GO PROGRAM ROUTINE - CP #ASCIIO ; IS IT AN "O" (Y/N) - JP Z,POUT ; PORT OUTPUT - CP #ASCIIH ; IS IT A "H" (Y/N) - JP Z,HXLOAD ; INTEL HEX FORMAT LOAD DATA - CP #ASCIII ; IS IT AN "I" (Y/N) - JP Z,PIN ; PORT INPUT - CP #ASCIID ; IS IT A "D" (Y/N) - JP Z,DUMP ; DUMP MEMORY - CP #ASCIIK - JP Z,KLOP ; LOOP ON KEYBOARD - CP #ASCIIM ; IS IT A "M" (Y/N) - JP Z,MOVE ; MOVE MEMORY COMMAND - CP #ASCIIF ; IS IT A "F" (Y/N) - JP Z,FILL ; FILL MEMORY COMMAND - LD HL,#TXT_COMMAND ; POINT AT ERROR TEXT - CALL MSG ; PRINT COMMAND LABEL - - JR SERIALCMDLOOP - - - - - -;__KLOP__________________________________________________________________________________________________________________________ -; -; READ FROM THE SERIAL PORT AND ECHO, MONITOR COMMAND "K" -;________________________________________________________________________________________________________________________________ -; -KLOP: - CALL KIN ; GET A KEY - CALL COUT ; OUTPUT KEY TO SCREEN - CP #ESC ; IS ? - JR NZ,KLOP ; NO, LOOP - JP SERIALCMDLOOP ; - -;__GETLN_________________________________________________________________________________________________________________________ -; -; READ A LINE(80) OF TEXT FROM THE SERIAL PORT, HANDLE , TERM ON -; EXIT IF TOO MANY CHARS STORE RESULT IN HL. CHAR COUNT IN C. -;________________________________________________________________________________________________________________________________ -; -GETLN: - LD C,#0 ; ZERO CHAR COUNTER - PUSH DE ; STORE DE -GETLNLOP: - CALL KIN ; GET A KEY - CALL COUT ; OUTPUT KEY TO SCREEN - CP #CR ; IS ? - JR Z,GETLNDONE ; YES, EXIT - CP #BS ; IS ? - JR NZ,GETLNSTORE ; NO, STORE CHAR - LD A,C ; A=C - CP #0 ; - JR Z,GETLNLOP ; NOTHING TO BACKSPACE, IGNORE & GET NEXT KEY - DEC HL ; PERFORM BACKSPACE - DEC C ; LOWER CHAR COUNTER - LD A,#0 ; - LD (HL),A ; STORE NULL IN BUFFER - LD A,#0x20 ; BLANK OUT CHAR ON TERM - CALL COUT ; - LD A,#BS ; - CALL COUT ; - JR GETLNLOP ; GET NEXT KEY -GETLNSTORE: - LD (HL),A ; STORE CHAR IN BUFFER - INC HL ; INC POINTER - INC C ; INC CHAR COUNTER - LD A,C ; A=C - CP #0x4D ; OUT OF BUFFER SPACE? - JR NZ,GETLNLOP ; NOPE, GET NEXT CHAR -GETLNDONE: - LD (HL),#0 ; STORE NULL IN BUFFER - POP DE ; RESTORE DE - RET ; - - -;__KIN___________________________________________________________________________________________________________________________ -; -; READ FROM THE SERIAL PORT AND ECHO & CONVERT INPUT TO UCASE -;________________________________________________________________________________________________________________________________ -; -KIN: - IN A,(UART5) ; READ LINE STATUS REGISTER - BIT 0,A ; TEST IF DATA IN RECEIVE BUFFER - JP Z,KIN ; LOOP UNTIL DATA IS READY - IN A,(UART0) ; THEN READ THE CHAR FROM THE UART - AND #0x7F ; STRIP HI BIT - CP #ASCIIA ; KEEP NUMBERS, CONTROLS - RET C ; AND UPPER CASE - CP #0x7B ; SEE IF NOT LOWER CASE - RET NC ; - AND #0x5F ; MAKE UPPER CASE - RET - - -;__COUT__________________________________________________________________________________________________________________________ -; -; WRITE THE VALUE IN "A" TO THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -COUT: - PUSH AF ; STORE AF -TX_BUSYLP: - IN A,(UART5) ; READ LINE STATUS REGISTER - BIT 5,A ; TEST IF UART IS READY TO SEND - JP Z,TX_BUSYLP ; IF NOT REPEAT - POP AF ; RESTORE AF - OUT (UART0),A ; THEN WRITE THE CHAR TO UART - RET ; DONE - - -;__CRLF__________________________________________________________________________________________________________________________ -; -; SEND CR & LF TO THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -CRLF: - PUSH HL ; PROTECT HL FROM OVERWRITE - LD HL,#TCRLF ; LOAD MESSAGE POINTER - CALL MSG ; SEBD MESSAGE TO SERIAL PORT - POP HL ; PROTECT HL FROM OVERWRITE - RET ; - - -;__LDHL__________________________________________________________________________________________________________________________ -; -; GET ONE WORD OF HEX DATA FROM BUFFER POINTED TO BY HL SERIAL PORT, RETURN IN HL -;________________________________________________________________________________________________________________________________ -; -LDHL: - PUSH DE ; STORE DE - CALL HEXIN ; GET K B. AND MAKE HEX - LD D,A ; THATS THE HI BYTE - CALL HEXIN ; DO HEX AGAIN - LD L,A ; THATS THE LOW BYTE - LD H,D ; MOVE TO HL - POP DE ; RESTORE BC - RET ; GO BACK WITH ADDRESS - - -;__HEXIN__________________________________________________________________________________________________________________________ -; -; GET ONE BYTE OF HEX DATA FROM BUFFER IN HL, RETURN IN A -;________________________________________________________________________________________________________________________________ -; -HEXIN: - PUSH BC ;SAVE BC REGS - CALL NIBL ;DO A NIBBLE - RLC A ;MOVE FIRST BYTE UPPER NIBBLE - RLC A ; - RLC A ; - RLC A ; - LD B,A ; SAVE ROTATED BYTE - CALL NIBL ; DO NEXT NIBBLE - ADD A,B ; COMBINE NIBBLES IN ACC - POP BC ; RESTORE BC - RET ; DONE -NIBL: - LD A,(HL) ; GET K B. DATA - INC HL ; INC KB POINTER - CP #0x40 ; TEST FOR ALPHA - JR NC,ALPH ; - AND #0x0F ; GET THE BITS - RET ; -ALPH: - AND #0x0F ; GET THE BITS - ADD A,#9 ; MAKE IT HEX A-F - RET ; - - -;__HEXINS_________________________________________________________________________________________________________________________ -; -; GET ONE BYTE OF HEX DATA FROM SERIAL PORT, RETURN IN A -;________________________________________________________________________________________________________________________________ -; -HEXINS: - PUSH BC ;SAVE BC REGS - CALL NIBLS ;DO A NIBBLE - RLC A ;MOVE FIRST BYTE UPPER NIBBLE - RLC A ; - RLC A ; - RLC A ; - LD B,A ; SAVE ROTATED BYTE - CALL NIBLS ; DO NEXT NIBBLE - ADD A,B ; COMBINE NIBBLES IN ACC - POP BC ; RESTORE BC - RET ; DONE -NIBLS: - CALL KIN ; GET K B. DATA - INC HL ; INC KB POINTER - CP #0x40 ; TEST FOR ALPHA - JR NC,ALPH ; - AND #0x0F ; GET THE BITS - RET ; - - -;__HXOUT_________________________________________________________________________________________________________________________ -; -; PRINT THE ACCUMULATOR CONTENTS AS HEX DATA ON THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -HXOUT: - PUSH BC ; SAVE BC - LD B,A ; - RLC A ; DO HIGH NIBBLE FIRST - RLC A ; - RLC A ; - RLC A ; - AND #0x0F ; ONLY THIS NOW - ADD A,#0x30 ; TRY A NUMBER - CP #0x3A ; TEST IT - JR C,OUT1 ; IF CY SET PRINT 'NUMBER' - ADD A,#0x07 ; MAKE IT AN ALPHA -OUT1: - CALL COUT ; SCREEN IT - LD A,B ; NEXT NIBBLE - AND #0x0F ; JUST THIS - ADD A,#0x30 ; TRY A NUMBER - CP #0x3A ; TEST IT - JR C,OUT2 ; PRINT 'NUMBER' - ADD A,#7 ; MAKE IT ALPHA -OUT2: - CALL COUT ; SCREEN IT - POP BC ; RESTORE BC - RET ; - - -;__SPACE_________________________________________________________________________________________________________________________ -; -; PRINT A SPACE CHARACTER ON THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -SPACE: - PUSH AF ; STORE AF - LD A,#0x20 ; LOAD A "SPACE" - CALL COUT ; SCREEN IT - POP AF ; RESTORE AF - RET ; DONE - -;__PHL_________________________________________________________________________________________________________________________ -; -; PRINT THE HL REG ON THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -PHL: - LD A,H ; GET HI BYTE - CALL HXOUT ; DO HEX OUT ROUTINE - LD A,L ; GET LOW BYTE - CALL HXOUT ; HEX IT - CALL SPACE ; - RET ; DONE - -;__POUT__________________________________________________________________________________________________________________________ -; -; OUTPUT TO AN I/O PORT, MONITOR COMMAND "O" -;________________________________________________________________________________________________________________________________ -; -POUT: -POUT1: - INC HL ; - CALL HEXIN ; GET PORT - LD C,A ; SAVE PORT POINTER - INC HL ; - CALL HEXIN ; GET DATA -OUTIT: - OUT (C),A ; - JP SERIALCMDLOOP ; - - -;__PIN___________________________________________________________________________________________________________________________ -; -; INPUT FROM AN I/O PORT, MONITOR COMMAND "I" -;________________________________________________________________________________________________________________________________ -; -PIN: - INC HL ; - CALL HEXIN ; GET PORT - LD C,A ; SAVE PORT POINTER - CALL CRLF ; - IN A,(C) ; GET DATA - CALL HXOUT ; SHOW IT - JP SERIALCMDLOOP ; - - - - - -;__CRLFA_________________________________________________________________________________________________________________________ -; -; PRINT COMMAND PROMPT TO THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -CRLFA: - PUSH HL ; PROTECT HL FROM OVERWRITE - LD HL,#PROMPT ; - CALL MSG ; - POP HL ; PROTECT HL FROM OVERWRITE - RET ; DONE - - -;__MSG___________________________________________________________________________________________________________________________ -; -; PRINT A STRING TO THE SERIAL PORT -;________________________________________________________________________________________________________________________________ -; -MSG: - -TX_SERLP: - LD A,(HL) ; GET CHARACTER TO A - CP #ENDT ; TEST FOR END BYTE - JP Z,TX_END ; JUMP IF END BYTE IS FOUND - CALL COUT ; - INC HL ; INC POINTER, TO NEXT CHAR - JP TX_SERLP ; TRANSMIT LOOP -TX_END: - RET ;ELSE DONE - -;__RUN___________________________________________________________________________________________________________________________ -; -; TRANSFER OUT OF MONITOR, USER OPTION "R" -;________________________________________________________________________________________________________________________________ -; -RUN: - INC HL ; SHOW READY - CALL LDHL ; GET START ADDRESS - JP (HL) ; - - -;__PROGRM________________________________________________________________________________________________________________________ -; -; PROGRAM RAM LOCATIONS, USER OPTION "P" -;________________________________________________________________________________________________________________________________ -; -PROGRM: - INC HL ; SHOW READY - PUSH HL ; STORE HL - CALL LDHL ; GET START ADDRESS - LD D,H ; - LD E,L ; DE POINTS TO ADDRESS TO PROGRAM - POP HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; -PROGRMLP: - CALL HEXIN ; GET NEXT HEX NUMBER - LD (DE),A ; STORE IT - INC DE ; NEXT ADDRESS; - CALL CRLFA ; CR,LF,> - LD A,#ASCIIP ; - CALL COUT ; - CALL SPACE ; - LD H,D ; - LD L,E ; - CALL PHL ; - LD HL,#KEYBUF ; SET POINTER TO KEYBUF AREA - CALL GETLN ; GET A LINE OF INPUT FROM THE USER - LD HL,#KEYBUF ; RESET POINTER TO START OF KEYBUF - LD A,(HL) ; LOAD FIRST CHAR INTO A - CP #0 ; END OF LINE? - JP Z,PROGRMEXIT ; YES, EXIT - JP PROGRMLP ; NO, LOOP -PROGRMEXIT: - JP SERIALCMDLOOP - - - - - - - -;__DUMP__________________________________________________________________________________________________________________________ -; -; PRINT A MEMORY DUMP, USER OPTION "D" -;________________________________________________________________________________________________________________________________ -; -DUMP: - INC HL ; SHOW READY - PUSH HL ; STORE HL - CALL LDHL ; GET START ADDRESS - LD D,H ; - LD E,L ; - POP HL ; - PUSH DE ; SAVE START - INC HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; - CALL LDHL ; GET END ADDRESS - INC HL ; ADD ONE MORE FOR LATER COMPARE - EX DE,HL ; PUT END ADDRESS IN DE - POP HL ; GET BACK START -GDATA: - CALL CRLF ; -BLKRD: - CALL PHL ; PRINT START LOCATION - LD C,#16 ; SET FOR 16 LOCS - PUSH HL ; SAVE STARTING HL -NXTONE: - EXX ; - LD C,E ; - IN A,(C) ; - EXX ; - AND #0x7F ; - CP #ESC ; - JP Z,SERIALCMDLOOP ; - CP #19 ; - JR Z,NXTONE ; - LD A,(HL) ; GET BYTE - CALL HXOUT ; PRINT IT - CALL SPACE ; -UPDH: - INC HL ; POINT NEXT - DEC C ; DEC LOC COUNT - JR NZ,NXTONE ; IF LINE NOT DONE - ; NOW PRINT 'DECODED' DATA TO RIGHT OF DUMP -PCRLF: - CALL SPACE ; SPACE IT - LD C,#16 ; SET FOR 16 CHARS - POP HL ; GET BACK START -PCRLF0: - LD A,(HL) ; GET BYTE - AND #0x060 ; SEE IF A 'DOT' - LD A,(HL) ; O K. TO GET - JR NZ,PDOT ; -DOT: - LD A,#0x2E ; LOAD A DOT -PDOT: - CALL COUT ; PRINT IT - INC HL ; - LD A,D ; - CP H ; - JR NZ,UPDH1 ; - LD A,E ; - CP L ; - JP Z,SERIALCMDLOOP ; -; -;IF BLOCK NOT DUMPED, DO NEXT CHARACTER OR LINE -UPDH1: - DEC C ; DEC CHAR COUNT - JR NZ,PCRLF0 ; DO NEXT -CONTD: - CALL CRLF ; - JP BLKRD ; - - -;__HXLOAD__________________________________________________________________________________________________________________________ -; -; LOAD INTEL HEX FORMAT FILE FROM THE SERIAL PORT, USER OPTION "H" -; -; [INTEL HEX FORMAT IS: -; 1) COLON (FRAME 0) -; 2) RECORD LENGTH FIELD (FRAMES 1 AND 2) -; 3) LOAD ADDRESS FIELD (FRAMES 3,4,5,6) -; 4) RECORD TYPE FIELD (FRAMES 7 AND 8) -; 5) DATA FIELD (FRAMES 9 TO 9+2*(RECORD LENGTH)-1 -; 6) CHECKSUM FIELD - SUM OF ALL BYTE VALUES FROM RECORD LENGTH TO AND -; INCLUDING CHECKSUM FIELD = 0 ] -; -; EXAMPLE OF INTEL HEX FORMAT FILE -; EACH LINE CONTAINS A CARRIAGE RETURN AS THE LAST CHARACTER -; :18F900002048454C4C4F20574F524C4420FF0D0AFF0D0A3EFF0D0A54BF -; :18F918006573742050726F746F7479706520524F4D204D6F6E69746FF1 -; :18F9300072205265616479200D0AFF0D0A434F4D4D414E4420524543F2 -; :18F948004549564544203AFF0D0A434845434B53554D204552524F52CD -; :16F96000FF0A0D20202D454E442D4F462D46494C452D20200A0DA4 -; :00000001FF -;________________________________________________________________________________________________________________________________ -HXLOAD: - CALL CRLF ; SHOW READY -HXLOAD0: - CALL KIN ; GET THE FIRST CHARACTER, EXPECTING A ':' -HXLOAD1: - CP #0x3A ; IS IT COLON ':'? START OF LINE OF INTEL HEX FILE - JR NZ,HXLOADERR ; IF NOT, MUST BE ERROR, ABORT ROUTINE - LD E,#0 ; FIRST TWO CHARACTERS IS THE RECORD LENGTH FIELD - CALL HEXINS ; GET US TWO CHARACTERS INTO BC, CONVERT IT TO A BYTE - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD D,A ; LOAD RECORD LENGTH COUNT INTO D - CALL HEXINS ; GET NEXT TWO CHARACTERS, MEMORY LOAD ADDRESS - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD H,A ; PUT VALUE IN H REGISTER - CALL HEXINS ; GET NEXT TWO CHARACTERS, MEMORY LOAD ADDRESS - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD L,A ; PUT VALUE IN L REGISTER - CALL HEXINS ; GET NEXT TWO CHARACTERS, RECORD FIELD TYPE - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - CP #1 ; RECORD FIELD TYPE 00 IS DATA, 01 IS END OF FILE - JR NZ,HXLOAD2 ; MUST BE THE END OF THAT FILE - CALL HEXINS ; GET NEXT TWO CHARACTERS, ASSEMBLE INTO BYTE - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD A,E ; RECALL THE CHECKSUM BYTE - AND A ; IS IT ZERO? - JP Z,HXLOADEXIT ; MUST BE O K., GO BACK FOR SOME MORE, ELSE - JR HXLOADERR ; CHECKSUMS DON'T ADD UP, ERROR OUT -HXLOAD2: - LD A,D ; RETRIEVE LINE CHARACTER COUNTER - AND A ; ARE WE DONE WITH THIS LINE? - JR Z,HXLOAD3 ; GET TWO MORE ASCII CHARACTERS, BUILD A BYTE AND CHECKSUM - CALL HEXINS ; GET NEXT TWO CHARS, CONVERT TO BYTE IN A, CHECKSUM IT - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD (HL),A ; CHECKSUM OK, MOVE CONVERTED BYTE IN A TO MEMORY LOCATION - INC HL ; INCREMENT POINTER TO NEXT MEMORY LOCATION - DEC D ; DECREMENT LINE CHARACTER COUNTER - JR HXLOAD2 ; AND KEEP LOADING INTO MEMORY UNTIL LINE IS COMPLETE -HXLOAD3: - CALL HEXINS ; GET TWO CHARS, BUILD BYTE AND CHECKSUM - CALL HXCHKSUM ; UPDATE HEX CHECK SUM - LD A,E ; CHECK THE CHECKSUM VALUE - AND A ; IS IT ZERO? - JR Z,HXLOADAGAIN ; IF THE CHECKSUM IS STILL OK, CONTINUE ON, ELSE -HXLOADERR: - LD HL,#TXT_CKSUMERR ; GET "CHECKSUM ERROR" MESSAGE - CALL MSG ; PRINT MESSAGE FROM (HL) AND TERMINATE THE LOAD - JP HXLOADEXIT ; RETURN TO PROMPT -HXCHKSUM: - LD C,A ; BUILD THE CHECKSUM - LD A,E ; - SUB C ; THE CHECKSUM SHOULD ALWAYS .EQUAL ZERO WHEN CHECKED - LD E,A ; SAVE THE CHECKSUM BACK WHERE IT CAME FROM - LD A,C ; RETRIEVE THE BYTE AND GO BACK - RET ; BACK TO CALLER -HXLOADAGAIN: - CALL KIN ; CATCH THE TRAILING CARRIAGE RETURN - JP HXLOAD0 ; LOAD ANOTHER LINE OF DATA -HXLOADEXIT: - CALL KIN ; CATCH ANY STRAY TRAILING CHARACTERS - JP SERIALCMDLOOP ; RETURN TO PROMPT - - -;__MOVE__________________________________________________________________________________________________________________________ -; -; MOVE MEMORY, USER OPTION "M" -;________________________________________________________________________________________________________________________________ -; -MOVE: - LD C,#3 - ; START GETNM REPLACEMENT - ; GET SOURCE STARTING MEMORY LOCATION - INC HL ; SHOW EXAMINE READY - PUSH HL ; - CALL LDHL ; LOAD IN HL REGS - LD D,H ; - LD E,L ; - POP HL ; - PUSH DE ; PUSH MEMORY ADDRESS ON STACK - INC HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; PRINT SPACE SEPARATOR - PUSH HL ; - CALL LDHL ; LOAD IN HL REGS - LD D,H ; - LD E,L ; - POP HL ; - PUSH DE ; PUSH MEMORY ADDRESS ON STACK - INC HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; PRINT SPACE SEPARATOR - CALL LDHL ; LOAD IN HL REGS - PUSH HL ; PUSH MEMORY ADDRESS ON STACK - ; END GETNM REPLACEMENT - POP DE ; DEST - POP BC ; SOURCE END - POP HL ; SOURCE - PUSH HL ; - LD A,L ; - CPL ; - LD L,A ; - LD A,H ; - CPL ; - LD H,A ; - INC HL ; - ADD HL,BC ; - LD C,L ; - LD B,H ; - POP HL ; - CALL MOVE_LOOP ; - JP SERIALCMDLOOP ; EXIT MOVE COMMAND ROUTINE -MOVE_LOOP: - LD A,(HL) ; FETCH - LD (DE),A ; DEPOSIT - INC HL ; BUMP SOURCE - INC DE ; BUMP DEST - DEC BC ; DEC COUNT - LD A,C ; - OR B ; - JP NZ,MOVE_LOOP ; TIL COUNT=0 - RET ; - -;__FILL__________________________________________________________________________________________________________________________ -; -; FILL MEMORY, USER OPTION "M" -;________________________________________________________________________________________________________________________________ -; -FILL: - LD C,#3 ; - ; START GETNM REPLACEMENT - ; GET FILL STARTING MEMORY LOCATION - INC HL ; SHOW EXAMINE READY - PUSH HL ; - CALL LDHL ; LOAD IN HL REGS - LD D,H ; - LD E,L ; - POP HL ; - PUSH DE ; PUSH MEMORY ADDRESS ON STACK - INC HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; PRINT SPACE SEPARATOR - ; GET FILL ENDING MEMORY LOCATION - PUSH HL ; - CALL LDHL ; LOAD IN HL REGS - LD D,H ; - LD E,L ; - POP HL ; - PUSH DE ; PUSH MEMORY ADDRESS ON STACK - INC HL ; - INC HL ; - INC HL ; - INC HL ; - INC HL ; PRINT SPACE SEPARATOR - ; GET TARGET STARTING MEMORY LOCATION - CALL HEXIN ; GET K B. AND MAKE HEX - LD C,A ; PUT FILL VALUE IN F SO IT IS SAVED FOR LATER - PUSH BC ; PUSH FILL VALUE BYTE ON STACK - ; END GETNM REPLACEMENT - POP BC ; BYTE - POP DE ; END - POP HL ; START - LD (HL),C ; -FILL_LOOP: - LD (HL),C ; - INC HL ; - LD A,E ; - SUB L ; - LD B,A ; - LD A,D ; - SUB H ; - OR B ; - JP NZ,FILL_LOOP ; - JP SERIALCMDLOOP ; - -;__GOCPM_________________________________________________________________________________________________________________________ -; -; BOOT CP/M FROM ROM DRIVE, USER OPTION "C" -;________________________________________________________________________________________________________________________________ -; -GOCPM: -;___________________________ -; REMOVE COMMENTS WHEN BURNED IN ROM -;___________________________ - -; LD A,000000000b ; RESET MPCL LATCH TO DEFAULT ROM -; OUT (MPCL),A ; -; LD HL,ROMSTART_CPM ; WHERE IN ROM CP/M IS STORED (FIRST BYTE) -; LD DE,RAMTARG_CPM ; WHERE IN RAM TO MOVE MONITOR TO (FIRST BYTE) -; LD BC,MOVSIZ_CPM ; NUMBER OF BYTES TO MOVE FROM ROM TO RAM -; LDIR ; PERFORM BLOCK COPY OF CP/M TO UPPER RAM PAGE -; LD A,010000000b ; RESET MPCL LATCH TO DEFAULT CP/M WITH 64K SETTING -; OUT (MPCL),A ; - - JP 0x0EA00 ; CP/M COLD BOOT ENTRY POINT - -; -;__INIT_UART_____________________________________________________________________________________________________________________ -; -; INITIALIZE UART -; PARAMS: SER_BAUD NEEDS TO BE SET TO BAUD RATE -; 1200: 96 = 1,843,200 / ( 16 X 1200 ) -; 2400: 48 = 1,843,200 / ( 16 X 2400 ) -; 4800: 24 = 1,843,200 / ( 16 X 4800 ) -; 9600: 12 = 1,843,200 / ( 16 X 9600 ) -; 19K2: 06 = 1,843,200 / ( 16 X 19,200 ) -; 38K4: 03 -; 57K6: 02 -; 115K2: 01 -; -;_________________________________________________________________________________________________________________________________ -; -INIT_UART: - LD A,#0x80 ; - OUT (UART3),A ; SET DLAB FLAG - LD A,(SER_BAUD) ; - OUT (UART0),A ; - LD A,#0 ; - OUT (UART1),A ; - LD A,#3 ; - OUT (UART3),A ; SET 8 BIT DATA, 1 STOPBIT - LD A,#3 ; set DTR & RTS - OUT (UART4),A ; - RET - - -; -;__FILL_MEM_______________________________________________________________________________________________________________________ -; -; FUNCTION : FILL MEMORY WITH A VALUE -; INPUT : HL = START ADDRESS BLOCK -; : BC = LENGTH OF BLOCK -; : A = VALUE TO FILL WITH -; USES : DE, BC -; OUTPUT : -; CALLS : -; TESTED : 13 FEB 2007 -;_________________________________________________________________________________________________________________________________ -; -FILL_MEM: - LD E,L ; - LD D,H ; - INC DE ; - LD (HL),A ; INITIALISE FIRST BYTE OF BLOCK WITH DATA BYTE IN A - DEC BC ; - LDIR ; FILL MEMORY - RET ; RETURN TO CALLER - -; -;__INITIALIZE_____________________________________________________________________________________________________________________ -; -; INITIALIZE SYSTEM -;_________________________________________________________________________________________________________________________________ -; -INITIALIZE: - LD A,#12 ; SPECIFY BAUD RATE 9600 BPS (9600,8,NONE,1) - LD (SER_BAUD),A ; - CALL INIT_UART ; INIT THE UART - RET ; -; - -;__MTERM_INIT________________________________________________________________________________________ -; -; SETUP 8255, MODE 0, PORT A=OUT, PORT B=IN, PORT C=OUT/OUT -; -;____________________________________________________________________________________________________ -MTERM_INIT: - LD A,#0x82 - OUT (PIOCONT),A - RET - -;__KB_GET____________________________________________________________________________________________ -; -; GET A SINGLE KEY AND DECODE -; -;____________________________________________________________________________________________________ -KB_GET: - PUSH HL ; STORE HL -KB_GET_LOOP: ; WAIT FOR KEY - CALL KB_SCAN ; SCAN KB ONCE - CP #0 ; NULL? - JR Z,KB_GET_LOOP ; LOOP WHILE NOT ZERO - LD D,A ; STORE A - LD A,#0x4F ; SCAN ALL COL LINES - OUT (PORTC),A ; SEND TO COLUMN LINES - CALL KB_SCAN_DELAY ; DELAY TO ALLOW LINES TO STABILIZE -KB_CLEAR_LOOP: ; WAIT FOR KEY TO CLEAR - IN A,(PORTB) ; GET ROWS - CP #0 ; ANYTHING PRESSED? - JR NZ,KB_CLEAR_LOOP ; YES, EXIT - LD A,D ; RESTORE A - LD D,#0x00 ; - LD HL,#KB_DECODE ; POINT TO BEGINNING OF TABLE -KB_GET_LLOOP: - CP (HL) ; MATCH? - JR Z,KB_GET_DONE ; FOUND, DONE - INC HL - INC D ; D + 1 - JP NZ,KB_GET_LLOOP ; NOT FOUND, LOOP UNTIL EOT -KB_GET_DONE: - LD A,D ; RESULT INTO A - POP HL ; RESTORE HL - RET - - - -;__KB_SCAN____________________________________________________________________________________________ -; -; SCAN KEYBOARD MATRIX FOR AN INPUT -; -;____________________________________________________________________________________________________ -KB_SCAN: - - LD C,#0 - LD A,#0x41 ; SCAN COL ONE - OUT (PORTC),A ; SEND TO COLUMN LINES - CALL KB_SCAN_DELAY ; DELAY TO ALLOW LINES TO STABILIZE - IN A,(PORTB) ; GET ROWS - CP #0x00 ; ANYTHING PRESSED? - JR NZ,KB_SCAN_FOUND ; YES, EXIT - - LD C,#0x0040 - LD A,#0x42 ; SCAN COL TWO - OUT (PORTC),A ; SEND TO COLUMN LINES - CALL KB_SCAN_DELAY ; DELAY TO ALLOW LINES TO STABILIZE - IN A,(PORTB) ; GET ROWS - CP #0 ; ANYTHING PRESSED? - JR NZ,KB_SCAN_FOUND ; YES, EXIT - - LD C,#0x0080 - LD A,#0x44 ; SCAN COL THREE - OUT (PORTC),A ; SEND TO COLUMN LINES - CALL KB_SCAN_DELAY ; DELAY TO ALLOW LINES TO STABILIZE - IN A,(PORTB) ; GET ROWS - CP #0x00 ; ANYTHING PRESSED? - JR NZ,KB_SCAN_FOUND ; YES, EXIT - - LD C,#0x00C0 ; - LD A,#0x48 ; SCAN COL FOUR - OUT (PORTC),A ; SEND TO COLUMN LINES - CALL KB_SCAN_DELAY ; DELAY TO ALLOW LINES TO STABILIZE - IN A,(PORTB) ; GET ROWS - CP #0x00 ; ANYTHING PRESSED? - JR NZ,KB_SCAN_FOUND ; YES, EXIT - - LD A, #0x40 ; TURN OFF ALL COLUMNS - OUT (PORTC),A ; SEND TO COLUMN LINES - LD A, #0x00 ; RETURN NULL - RET ; EXIT - -KB_SCAN_FOUND: - AND #0x3F ; CLEAR TOP TWO BITS - OR C ; ADD IN ROW BITS - LD C,A ; STORE VALUE - LD A,#0x00 ; TURN OFF ALL COLUMNS - OUT (PORTC),A ; SEND TO COLUMN LINES - LD A,C ; RESTORE VALUE - RET - -PAUSE: -KB_SCAN_DELAY: - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - NOP - RET - - - -;__HEXDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP -; -;____________________________________________________________________________________________________ -HEXDISPLAY: - PUSH HL ; STORE HL - PUSH AF ; STORE AF - PUSH BC ; STORE BC - LD BC,#0007 - ADD HL,BC - LD B,#0x08 ; SET DIGIT COUNT - LD A,#0x40 ; SET CONTROL PORT 7218 TO OFF - OUT (PORTC),A ; OUTPUT - CALL PAUSE ; WAIT - LD A,#0x0F0 ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL) - OUT (PORTA),A ; OUTPUT TO PORT - LD A,#0x80 ; STROBE WRITE PULSE WITH CONTROL=1 - OUT (PORTC),A ; OUTPUT TO PORT - CALL PAUSE ; WAIT - LD A,#0x40 ; SET CONTROL PORT 7218 TO OFF - OUT (PORTC),A ; OUTPUT -HEXDISPLAY_LP: - LD A,(HL) ; GET DISPLAY DIGIT - CALL DECODEDISPLAY ; DECODE DISPLAY - OUT (PORTA),A ; OUT TO PORTA - LD A,#0x00 ; SET WRITE STROBE - OUT (PORTC),A ; OUT TO PORTC - CALL PAUSE ; DELAY - LD A,#0x40 ; SET CONTROL PORT OFF - OUT (PORTC),A ; OUT TO PORTC - CALL PAUSE ; WAIT - DEC HL ; INC POINTER - DJNZ HEXDISPLAY_LP ; LOOP FOR NEXT DIGIT - POP BC ; RESTORE BC - POP AF ; RESTORE AF - POP HL ; RESTORE HL - RET - -;__DECODEDISPLAY_____________________________________________________________________________________ -; -; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP -; -;____________________________________________________________________________________________________ -DECODEDISPLAY: - PUSH BC ; STORE BC - PUSH HL ; STORE HL - LD HL,#SEGDECODE ; POINT HL TO DECODE TABLE - LD B,#0x00 ; RESET HIGH BYTE - LD C,A ; CHAR INTO LOW BYTE - ADD HL,BC ; SET TABLE POINTER - LD A,(HL) ; GET VALUE - POP HL ; RESTORE HL - POP BC ; RESTORE BC - RET - - -;__SEGDISPLAY________________________________________________________________________________________ -; -; DISPLAY CONTENTS OF DISPLAYBUF IN DECODED HEX BITS 0-3 ARE DISPLAYED DIG, BIT 7 IS DP -; -;____________________________________________________________________________________________________ -SEGDISPLAY: - PUSH AF ; STORE AF - PUSH BC ; STORE BC - LD BC,#0x0007 - ADD HL,BC - LD B,#0x08 ; SET DIGIT COUNT - LD A,#0x40 ; SET CONTROL PORT 7218 TO OFF - OUT (PORTC),A ; OUTPUT - CALL PAUSE ; WAIT - LD A,#0x0F0 ; SET CONTROL TO 1111 (DATA COMING, HEX DECODE,NO DECODE, NORMAL) - OUT (PORTA),A ; OUTPUT TO PORT - LD A,#0x80 ; STROBE WRITE PULSE WITH CONTROL=1 - OUT (PORTC),A ; OUTPUT TO PORT - CALL PAUSE ; WAIT - LD A,#0x40 ; SET CONTROL PORT 7218 TO OFF - OUT (PORTC),A ; OUTPUT -SEGDISPLAY_LP: - LD A,(HL) ; GET DISPLAY DIGIT - OUT (PORTA),A ; OUT TO PORTA - LD A,#0x00 ; SET WRITE STROBE - OUT (PORTC),A ; OUT TO PORTC - CALL PAUSE ; DELAY - LD A,#0x40 ; SET CONTROL PORT OFF - OUT (PORTC),A ; OUT TO PORTC - CALL PAUSE ; WAIT - DEC HL ; INC POINTER - DJNZ SEGDISPLAY_LP ; LOOP FOR NEXT DIGIT - POP BC ; RESTORE BC - POP AF ; RESTORE AF - RET - -; -;__WORK_AREA___________________________________________________________________________________________________________________ -; -; RESERVED RAM FOR MONITOR WORKING AREA -;_____________________________________________________________________________________________________________________________ -; -SER_BAUD: .DS 1 ; SPECIFY DESIRED UART COM RATE IN BPS -KEYBUF: .ascii " " - .ascii " " -DISPLAYBUF: .DB 00,00,00,00,00,00,00,00 -IDEDEVICE: .DB 1 ; IDE DRIVE SELECT FLAG (00H=PRIAMRY, 10H = SECONDARY) -IDE_SECTOR_BUFFER: - .DS 0x00200 - - - - -; -;__TEXT_STRINGS_________________________________________________________________________________________________________________ -; -; SYSTEM TEXT STRINGS -;_____________________________________________________________________________________________________________________________ -; -TCRLF: - .DB CR,LF,ENDT - -PROMPT: - .DB CR,LF - .ascii ">" - .DB ENDT - -TXT_READY: - .DB CR,LF - .ascii " NN NN 8888 VV VV EEEEEEEEEE MM MM" - .DB CR,LF - .ascii " NNNN NN 88 88 VV VV EE MMMM MMMM" - .DB CR,LF - .ascii " NN NN NN 88 88 VV VV EE MM MM MM MM" - .DB CR,LF - .ascii " NN NNNN 88 88 VV VV EE MM MM MM" - .DB CR,LF - .ascii " NN NN 8888 VV VV EEEEEEE MM MM" - .DB CR,LF - .ascii " NN NN 88 88 VV VV EE MM MM" - .DB CR,LF - .ascii " NN NN 88 88 VV VV EE MM MM" - .DB CR,LF - .ascii " NN NN 88 88 VVV EE MM MM" - .DB CR,LF - .ascii " NN NN 8888 V EEEEEEEEEE MM MM S B C" - .DB CR,LF - .DB CR,LF - .ascii " ****************************************************************************" - .DB CR,LF - .ascii "MONITOR READY " - .DB CR,LF,ENDT - -TXT_COMMAND: - .DB CR,LF - .ascii "UNKNOWN COMMAND." - .DB ENDT - -TXT_CKSUMERR: - .DB CR,LF - .ascii "CHECKSUM ERROR." - .DB ENDT -CPUUP: - .DB 0x084,0x0EE,0x0BB,0x080,0x0BB,0x0EE,0x0CB,0x084 -ADDR: - .DB 0x00,0x00,0x00,0x00,0x08C,0x0BD,0x0BD,0x0FE - - -PORT: - .DB 0x00,0x00,0x80,0x80,0x094,0x08C,0x09D,0x0EE -SEC: - .DB 0x80,0x80,0x80,0x80,0x80,0x0CB,0x0CF,0x0D7 - - -;_KB DECODE TABLE__________________________________________________________________________________________________________ -; -; -KB_DECODE: -; 0 1 2 3 4 5 6 7 8 9 A B C D E F - .DB 0x41,0x02,0x42,0x82,0x04,0x44,0x84,0x08,0x48,0x88,0x10,0x50,0x90,0x20,0x60,0x0A0 -; FW BK CL EN DP EX GO BO - .DB 0x01,0x81,0x0C1,0x0C2,0x0C4,0x0C8,0x0D0,0x0E0 -; -; F-KEYS, -; FW = FORWARD -; BK = BACKWARD -; CL = CLEAR -; EN = ENTER -; DP = DEPOSIT (INTO MEM) -; EX = EXAMINE (MEM) -; GO = GO -; BO = BOOT -;_________________________________________________________________________________________________________________________ -;_HEX 7_SEG_DECODE_TABLE__________________________________________________________________________________________________ -; -; 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F, ,- -; AND WITH 7FH TO TURN ON DP -;_________________________________________________________________________________________________________________________ -SEGDECODE: - .DB 0x0FB,0x0B0,0x0ED,0x0F5,0x0B6,0x0D7,0x0DF,0x0F0,0x0FF,0x0F7,0x0FE,0x09F,0x0CB,0x0BD,0x0CF,0x0CE,0x080,0x084,0x00,0x0EE,0x09D - -;********************* END OF PROGRAM *********************************** - -;dwg; .ORG 08FFFh -;dwg; .DB 000h -;dwg; .END - -_dbgmon_end:: - .area _CODE - .area _CABS diff --git a/branches/dgg/cpurom/src/dwgh2b.c b/branches/dgg/cpurom/src/dwgh2b.c deleted file mode 100644 index cc70ad9a..00000000 --- a/branches/dgg/cpurom/src/dwgh2b.c +++ /dev/null @@ -1,128 +0,0 @@ -// --------------------------------------------------- -// hex2bin.c 21-May-11 Running on Mac OS X 10.6.6 -// S/n 2011-1042-654321 Written by Douglas W. Goodall -// Copyright(c)2011 Douglas W. Goodall, United States. -// --------------------------------------------------- -// This file is part of Vintage Modern Assembler Plus Tools. -// -// VMAPT is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// VMAPT is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with VMAPT. If not, see . -// - -#include -#include -#include - -#define DATA_RECORD 0x00 -#define EOF_RECORD 0x01 - -int main(int argc,char **argv) -{ - char g_szBuffer2[128]; - char szByteBuffer[2+1]; - char *p; - int i; - int iTemp; - - char cColon; - - char szLength[2+1]; - int iLength; - - char szAddress[4+1]; - unsigned int uiAddress; - - char szRecordType[2+1]; - unsigned char ucRecordType; - - char szData[80]; - unsigned char ucBinBuffer[32+1]; - - char szChecksum[2+1]; - unsigned char ucChecksum; - - unsigned int uiLastByte = 0; - - if(1 == argc) { - printf("usage - hex2bin \n"); - exit(EXIT_FAILURE); - } - - char szBinFile[255]; - char szHexFile[255]; - - strcpy(szHexFile,argv[1]); - strcpy(szBinFile,argv[1]); - - strcat(szBinFile,".bin"); - strcat(szHexFile,".hex"); - - unsigned char memory[0xfff0]; - memset(memory,0,sizeof(memory)); - - FILE * fhex = fopen(szHexFile,"r"); - if(NULL == fhex) { - printf("Sorry, cannot open %s for input\n",szHexFile); - exit(EXIT_FAILURE); - } - p = fgets(g_szBuffer2,sizeof(g_szBuffer2),fhex); - while(NULL != p) { - g_szBuffer2[strlen(g_szBuffer2)-1] = 0; - cColon = g_szBuffer2[0]; - - memset(szLength,0,sizeof(szLength)); - memcpy(szLength,&g_szBuffer2[1],2); - sscanf(szLength,"%02X",&iLength); - - memset(szAddress,0,sizeof(szAddress)); - memcpy(szAddress,&g_szBuffer2[3],4); - sscanf(szAddress,"%04X",&uiAddress); - - memset(szRecordType,0,sizeof(szRecordType)); - memcpy(szRecordType,&g_szBuffer2[7],2); - - sscanf(szRecordType,"%02X",&iTemp); - ucRecordType = (unsigned char)iTemp; - - if(0 == ucRecordType) { - memset(szData,0,sizeof(szData)); - memcpy(szData,&g_szBuffer2[9],iLength*2); - for(i=0;i -#include -#include - -#include "portab.h" -#ifndef __GNUC__ -#include "cpmbdos.h" -#include "cprintf.h" -#endif - -/* - * 1MB = 1,048,576 bytes - * 32MB = 1,048,576 * 32 = 33,554,432 - * - * physical sector is 512 bytes - * physical track is 256 sectors = 131,072 - * physical drive is 33,554,432 - * physical tracks are 33,554,432 / 131,072 = 256 - * physical tracks per physical drive are 256 - * - * logical sector is 128 bytes - * logical track is 256 sectors (aka ) - * logical drive is 8192KB (aka 8192KB/32KB = 256 logical tracks) - * - * - * 8,388,608 bytes is a logical drive - * 131,072 bytes is a physical track - * 8,388,608 / 131,072 = 64 physical tracks per logical drive - * - * One byte (0-255) will just hold the number of physical tracks needing - * to be shared amoung up to four logical drives. - * - * physical track 0 - partition sector and second-stage loader if needed - * physical tracks 1 - 64 = 8.0MB partition ( 64 * 131,072 = 8,388,608 ) - * physical tracks 65 - 128 = 8.0MB partition ( 64 * 131,072 = 8,388,608 ) - * physical tracks 129 - 192 = 8.0MB partition ( 64 * 131,072 = 8,388,608 ) - * physical tracks 193 - 255 = 7.9MB partition ( 63 * 131,072 = 8,257,536 ) - * - */ - -#define MAX_PARTS 4 -#define TRKS_PER_PHY_DRV 256 -#define TRKS_PER_LOG_DRV 64 /* 256 sectors * 512 = 128k */ - -#define SAFESTRING 80 /* make large enough to avoid accidental overrun */ - -#define U8 unsigned char - -struct PART_TABLE { /* in-memory instance of partition table */ - U8 start; /* starting track of a partition */ - U8 end; /* ending track of a partition */ -} pt[MAX_PARTS] = { { 0, 0 }, { 0, 0 }, { 0, 0 }, { 0, 0 } }; - -U8 bRunning; /* scratchpad used used by the main loop */ -U8 end; /* scratchpad used to hold ending track of a part */ -U8 Index; /* scratchpad used as index for for loops */ -U8 NumParts; /* scratchpad to hold the current number of parts */ -U8 LastEnd; /* scratchpad to hold the last track allocated */ -U8 NewEnd; /* scratchpad to hold the proposed ending track */ -U8 NewMax; /* scratchpad to hold the proposed max part size */ -U8 NewSize; /* scratchpad to hold the decided new part size */ -U8 NewStart; /* scratchpad to hold the decided starting track */ -U8 start; /* scratchpad to hold the starting track of a part */ -U8 Avail; /* scratchpad to hold the remaining avialable tracks */ - -char szChoice[SAFESTRING]; /* string used to receive keystrokes */ -char szTemp[SAFESTRING]; /* string used for general purposes */ - -/* THESE ARE USED BY THE LIBRARY ROUTINES */ -#ifndef __GNUC__ -char getchar(void) -{ - struct BDOSCALL cread = { C_READ, { (unsigned int)0 } }; - return cpmbdos(&cread); -} -void outchar(char c) -{ - struct BDOSCALL cwrite = { C_WRITE, { (unsigned int)c } }; - cpmbdos(&cwrite); -} -#endif - -void display_menu(void) -{ - if(NumParts < MAX_PARTS) { - if(0 < Avail) { - printf("a - add partition #%d\n",NumParts+1); - } - } - if(0 < NumParts) { - printf("d - delete partition #%d\n",NumParts); - } - if(1 < NumParts) { - printf("D - delete all partitions, 1 - %d\n",NumParts); - } - if(0 == NumParts) { - printf("A - create all 8MB partitions\n"); - } - printf("q - quit fdisk\n\n"); -} - -char query(char *str) -{ - printf("%s",str); - gets(szTemp); - if('Y' == szTemp[0]) { - return TRUE; - } else { - return FALSE; - } -} - -void delete(void) -{ - if(0 < NumParts) { - if(TRUE == query("Delete partition(Y/n)?")) { - pt[NumParts-1].start = 0; - pt[NumParts-1].end = 0; - } - } -} - -void deleteall(void) -{ - if(0 < NumParts) { - if(TRUE == query("Delete all partitions(Y/n)?")) { - for(Index=0;Index. -*********************************************************************** - When invoked as 'hex2bin' read a sequence of Intel hex files - and create an overlaid binary file. - - When invoked as 'bin2hex' read a binary file and create an - Intel hex file. - - All command line numeric constants may be specified in any - radix. -*********************************************************************** - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - in the file COPYING in the distribution directory along with this - program. If not, see . - -**********************************************************************/ -#include -#include -#include -#include "jrctypes.h" - -#define true 1 -#define false 0 -#define SEG_MASK 0x00FFFFu -#define LBA_MASK 0x00FF0000ul -#define MAX_MASK (LBA_MASK|SEG_MASK) -#define ONE_MEG 0x100000ul - -dword upper_lba = 0; /* upper address */ -dword address_mask = SEG_MASK; /* address mask */ -byte pad = 0xFF; -byte *buffer; -dword rom_size = 0; -dword overwrite; /* count of possible overwrites */ -byte h2b, verbose; -char *outfilename = NULL; -char *binfilename = NULL; -dword source_address, source_limit; -dword dest_address, dest_limit; -FILE *infile; -FILE *outfile; -byte checksum; -char line[1024]; -char *lp; -long int lineno; - - - -dword convert_constant(char *str) -{ - char *final; - dword value = strtoul(str, &final, 0); - - if (*final == 'k' || *final == 'K') value *= 1024ul; - else if (*final == 'M' || *final == 'm') value *= ONE_MEG; - - return value; -} - -void error(byte level, char *msg) -{ - printf("%s(%d): %s\n", - level>1 ? "Error" : "Warning", (int)level, msg); - if (level>1) exit(level); - else if (level==0) printf("line %ld %s", lineno, line); -} - - -int getnibble(void) -{ - char ch; - - if (lp) { - ch = *lp++; - if (ch>='0' && ch<='9') ch -= '0'; - else if (ch>='A' && ch<='F') ch -= 'A'-10; - else if (ch>='a' && ch<='f') ch -= 'a'-10; - else { - error(0,"Illegal hex digit"); - ch = -1; - } - } - else error(0,"Line is too short"); - return (int)ch; -} - -int getbyte(void) -{ - int b = getnibble(); - b <<= 4; - b += getnibble(); - checksum += b; - return b; -} - -int getword(void) -{ - int w = getbyte(); - w <<= 8; - w += getbyte(); - return w; -} - -dword getdword(void) -{ - dword d = getword(); - d <<= 16; - d += getword(); - return d; -} - - -void putbyte(dword address, byte data) -{ - if (address < source_address || address > source_limit) return; - address -= source_address; - address += dest_address; - if (address > dest_limit) return; - if (address >= rom_size) { - printf("Line %ld ",lineno); error(2,"Data beyond end of ROM"); - } - if (buffer[address] != pad) { - overwrite++; - if (verbose || overwrite<=100) printf("Warning(1): Overwrite at ROM address 0x%lX\n", address); - } - buffer[address] = data; -} - - -void usage(void) -{ - printf("hex2bin.c (bin2hex) -- " __DATE__ " " __TIME__ ".\n" - "Copyright (c) 2011 John R Coffman. All rights reserved.\n" - "Distributed under the GNU General Public License, a copy of which\n" - "is contained in the file COPYING in the distribution directory.\n\n"); - if (h2b) printf( - "Usage:\n" - " hex2bin [ ]+\n\n" - " Options:\n" - " -o \n" - " -p \n" - " -R default 64K\n" - " -v []\n" - " Flags:\n" - " -d \n" - " -D \n" - " -s \n" - " -S \n" - ); - else printf( - "Usage:\n" - " bin2hex [ ]+\n\n" - " Options:\n" - " -o \n" - " -p \n" - " -R default 1024K\n" - " -v []\n" - " Flags:\n" - " -d \n" - " -D \n" - " -s \n" - " -S \n" - ); -} - - -void hout_byte(byte data) -{ - checksum -= data; - fprintf(outfile, "%02X", (int)data); -} -void hout_word(word data) -{ - hout_byte(data>>8); - hout_byte(data); -} -void begin_record(byte length) -{ - checksum = 0; - fputc(':', outfile); - hout_byte(length); -} -void end_record(void) -{ - hout_byte(checksum); - fputc('\n', outfile); -} - -void write_lba(dword address) -{ - if (verbose==5) printf("Address: %06lX\n", address); - - if ((address & LBA_MASK) != upper_lba) { - upper_lba = address & LBA_MASK; - begin_record(2); - hout_word(0); - if (rom_size > ONE_MEG) { - hout_byte(4); /* linear address */ - hout_word(upper_lba>>16); - } - else { /* handle ROMs 1meg and smaller */ - hout_byte(2); /* segment address */ - hout_word(upper_lba>>4); - } - end_record(); - } -} - -void write_data(word nbytes, byte *buf, dword address) -{ - /* compress from the high end */ - while (nbytes && buf[nbytes-1]==pad) --nbytes; - /* compress from the low end */ - while (nbytes && *buf==pad) { - ++buf; - ++address; - --nbytes; - } - if (nbytes) { - write_lba(address); - begin_record(nbytes); - hout_word(address & 0xFFFFu); - hout_byte(0); /* data record */ - while(nbytes--) hout_byte(*buf++); - end_record(); - } -} - -#define min(a,b) ((a)<(b)?(a):(b)) -#define NREC 16 - -void write_hex_file(FILE *outfile) -{ - dword nbytes; - dword vaddr; - dword n; - byte *buf; - - buf = buffer; - vaddr = 0; - nbytes = rom_size; - n = min(nbytes, NREC); - do { - write_data(n, buf, vaddr); - buf += n; - vaddr += n; - nbytes -= n; - n = min(nbytes, NREC); - } while (n); -/* write the end-of-file record */ - fprintf(outfile,":00000001FF\n"); -} - - -void scan_bin_file(char *filename) -{ - dword length; - dword nbytes; - int data; - dword inaddr; - - infile = fopen(filename, "rb"); - if (!infile) { - strcpy(line,"Cannot find file: "); - error(5, strcat(line, filename)); - } - - fseek(infile,0L,SEEK_END); - length = ftell(infile); - -// length = filelength(fileno(infile)); - - nbytes = 0; - inaddr = dest_address; - if (source_address < length) { - fseek(infile, source_address, SEEK_SET); - while (inaddr=3) printf("%s", lp-1); - checksum = 0; - ldata = getbyte(); - laddr = getword(); - rectype = getbyte(); - switch (rectype) { - case 0: /* data record */ - index = 0; - while (ldata--) { - data = getbyte(); - putbyte(upper_lba + ((laddr + index)&address_mask), data); - index++; - } - break; - case 1: /* end of file record */ - EndOfFile = 1; - break; - case 2: /* segment address */ - address_mask = SEG_MASK; - value = getword(); - upper_lba = value<<4; /* start of segment */ - ldata -= 2; - break; - case 4: /* linear upper address */ - address_mask = MAX_MASK; - value = getword(); - upper_lba = value<<16; /* full 32-bit address range */ - ldata -= 2; - break; - case 3: /* start CS:IP */ - case 5: /* linear start address */ - value = getdword(); - ldata -= 4; - default: - error(0,"Unknown record type:"); - } - getbyte(); /* get final checksum */ - if (checksum) { - error(0,"Checksum failure"); - } - } while (lp && !EndOfFile); - fclose(infile); -} - - -void global_options(int argc, char *argv[]) -{ - int iarg; - char *cp; - char *tp; - char ch; - - h2b = false; - rom_size = ONE_MEG; /* bin2hex default value */ -/* decide which conversion to do */ - if (strstr(argv[0],"hex2bin") -#ifdef MSDOS - || strstr(argv[0],"HEX2BIN") -#endif - ) { - h2b = true; - rom_size = 64 * 1024ul; /* default value */ - } /* assume 'bin2hex' otherwise */ - - if (argc<2) { usage(); exit(0); } - -/* scan the global command line options */ - for (iarg = 0; iarg MAX_MASK+1) error(5, "ROM size too big"); - if (rom_size < 256) error(5, "ROM size too small"); - *cp = *tp = 0; - break; - case 'v': /* print verbose statistics */ - verbose++; - if (!*tp) tp = argv[++iarg]; - if (*tp>='1' && *tp<='5' && tp[1]==0) verbose += (*tp - '1'); - else tp = cp; - *cp = *tp = 0; - break; - case 'Y': { - int i; - for (i=0; i -#include -#include - -int main(int argc,char **argv) -{ - char szTemp[128]; - int index; - - strcpy(szTemp,argv[1]); - for(index=0;index -#include -#include - -int main(int argc,char **argv) -{ - char szTemp[128]; - int index; - - strcpy(szTemp,argv[1]); - for(index=0;index -#include -#include - -int main(int argc,char **argv) -{ - char szTemp[128]; - int index; - - strcpy(szTemp,argv[1]); - for(index=0;index2) { - printf(" "); - strcpy(szTemp,argv[2]); - for(index=0;index3) { - printf(" "); - strcpy(szTemp,argv[3]); - for(index=0;index4) { - printf(" "); - strcpy(szTemp,argv[4]); - for(index=0;index -#include -#include - -int main(int argc,char **argv) -{ - char szTemp[128]; - int index; - - strcpy(szTemp,argv[1]); - for(index=0;index. -// - -#include -#include -#include - -#define DATA_RECORD 0x00 -#define EOF_RECORD 0x01 - -int main(int argc,char **argv) -{ - FILE * fcom, * fhex; - char g_szBuffer2[128]; - char szByteBuffer[2+1]; - char *p; - int iTemp; - - char cColon; - - char szLength[2+1]; - int iLength; - - char szAddress[4+1]; - unsigned int uiAddress; - - char szRecordType[2+1]; - unsigned char ucRecordType; - - char szData[80]; - unsigned char ucBinBuffer[32+1]; - - char szChecksum[2+1]; - unsigned char ucChecksum; - - unsigned int uiLastByte = 0; - - char szComFile[255]; - char szHexFile[255]; - int i; - - unsigned char memory[0xfff0]; - - if(1 == argc) { - printf("usage - load \n"); - exit(EXIT_FAILURE); - } - - strcpy(szHexFile,argv[1]); - strcpy(szComFile,argv[1]); - - strcat(szComFile,".com"); - strcat(szHexFile,".hex"); - - memset(memory,0,sizeof(memory)); - - fhex = fopen(szHexFile,"r"); - if(NULL == fhex) { - printf("Sorry, cannot open %s for input\n",szHexFile); - exit(EXIT_FAILURE); - } - p = fgets(g_szBuffer2,sizeof(g_szBuffer2),fhex); - while(NULL != p) { - g_szBuffer2[strlen(g_szBuffer2)-1] = 0; - cColon = g_szBuffer2[0]; - - memset(szLength,0,sizeof(szLength)); - memcpy(szLength,&g_szBuffer2[1],2); - sscanf(szLength,"%02X",&iLength); - - memset(szAddress,0,sizeof(szAddress)); - memcpy(szAddress,&g_szBuffer2[3],4); - sscanf(szAddress,"%04X",&uiAddress); - - memset(szRecordType,0,sizeof(szRecordType)); - memcpy(szRecordType,&g_szBuffer2[7],2); - - sscanf(szRecordType,"%02X",&iTemp); - ucRecordType = (unsigned char)iTemp; - - if(0 == ucRecordType) { - memset(szData,0,sizeof(szData)); - memcpy(szData,&g_szBuffer2[9],iLength*2); - for(i=0;i -#include -#include -#include -#include -#include -#include - - -void usage(void) -{ - printf("N8VEM sysgen v1.0\n"); - printf("usage:\n"); - printf("sysgen -C xx filename - Create filename xx KB in size\n"); - printf("sysgen -i importfile imagefile - Import the contents of importfile to Imagefile\n"); - printf("sysgen -e exportfile imagefile - Export system track to exportfile\n"); - exit(1); -} - -int main(int argc, char *argv[]) - -{ - - int i, size, fd1, fd2, nwritten, nread; - int ntotal = 0; - char buffer [10240]; - - if (argc != 4) - { - printf("\nIncorrect number of parameters\n\n"); - usage(); - } - - - if (strcmp(argv[1], "-C") == 0) /* Create command */ - { - for (i=0; i<1024; i++) buffer[i] = 229; - - fd1 = creat(argv[3],O_WRONLY|S_IRWXU); - - if ( fd1 == -1) - { - printf("error creating file %s\n",argv[3]); - exit(1); - } - for (i=0; i< (atoi(argv[2])) ; i++) - { - nwritten = write (fd1, &buffer, 1024); - if (nwritten == -1) - { - printf ("error writing file %s\n",argv[3]); - exit(1); - } - ntotal+=nwritten; - } - printf("wrote %d bytes to file %s\n",ntotal,argv[3]); - close(fd1); - exit(0); - } - - if (strcmp(argv[1], "-i") == 0) /* Import command */ - { - - fd1 = open (argv[2],O_RDONLY); - if (fd1 == -1) - { - printf("error opening input file %s\n",argv[2]); - exit(1); - } - fd2 = open (argv[3], O_WRONLY); - if ( fd2 == -1) - { - printf("error opening output file %s\n",argv[3]); - exit(1); - } - - nread = read( fd1, &buffer, 10240); - - if (nread == -1) - { - printf ("error reading from input file %s\n", argv[2]); - exit(1); - } - nwritten = write ( fd2, &buffer, nread); - if (nwritten == -1) - { - printf ("error writing to output file %s\n", argv[3]); - exit(1); - } - printf("wrote %d bytes to file %s\n",nwritten,argv[3]); - - close(fd1); - close(fd2); - - exit(0); - } - - if (strcmp(argv[1], "-e") == 0) /* Export command */ - { - - fd1 = creat(argv[2],O_WRONLY|S_IRWXU); /* export file */ - - if (fd1 == -1) - { - printf("error creating export file %s\n",argv[2]); - exit(1); - } - - fd2 = open(argv[3],O_RDONLY); /* romimage file */ - if (fd2 == -1) - { - printf("error opening romimage file %s\n",argv[3]); - exit(1); - } - nread = read( fd2, &buffer, 10240); - if (nread == -1) - { - printf ("error reading from romimage file %s\n",argv[3]); - exit(1); - } - nwritten = write( fd1, &buffer, nread); - if (nwritten == -1) - { - printf ("error writing to outputfile %s\n",argv[2]); - exit(1); - } - printf("wrote %d bytes to file %s\n",nwritten,argv[2]); - - close(fd1); - close(fd2); - - exit(0); - } - - usage(); - - return EXIT_SUCCESS; -} - - diff --git a/branches/dgg/cpurom/tmp/stuff/baseline.arf b/branches/dgg/cpurom/tmp/stuff/baseline.arf deleted file mode 100644 index e78d4aa5..00000000 --- a/branches/dgg/cpurom/tmp/stuff/baseline.arf +++ /dev/null @@ -1,15 +0,0 @@ --mjx --i baseline.ihx --k /Developer/sdcc/share/sdcc/lib/z80 --l z80 --b _CCPB03 = 0xD000 --b _BDOSB01 = 0xD800 --b _CBIOS = 0xE600 --b _DBGMON = 0x8000 -obj/crt0.rel -obj/baseline.rel -obj/dbgmon.rel -obj/ccpb03.rel -obj/bdosb01.rel -obj/cbios.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/baseline.lk b/branches/dgg/cpurom/tmp/stuff/baseline.lk deleted file mode 100644 index e78d4aa5..00000000 --- a/branches/dgg/cpurom/tmp/stuff/baseline.lk +++ /dev/null @@ -1,15 +0,0 @@ --mjx --i baseline.ihx --k /Developer/sdcc/share/sdcc/lib/z80 --l z80 --b _CCPB03 = 0xD000 --b _BDOSB01 = 0xD800 --b _CBIOS = 0xE600 --b _DBGMON = 0x8000 -obj/crt0.rel -obj/baseline.rel -obj/dbgmon.rel -obj/ccpb03.rel -obj/bdosb01.rel -obj/cbios.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/baseline.lnk b/branches/dgg/cpurom/tmp/stuff/baseline.lnk deleted file mode 100644 index e78d4aa5..00000000 --- a/branches/dgg/cpurom/tmp/stuff/baseline.lnk +++ /dev/null @@ -1,15 +0,0 @@ --mjx --i baseline.ihx --k /Developer/sdcc/share/sdcc/lib/z80 --l z80 --b _CCPB03 = 0xD000 --b _BDOSB01 = 0xD800 --b _CBIOS = 0xE600 --b _DBGMON = 0x8000 -obj/crt0.rel -obj/baseline.rel -obj/dbgmon.rel -obj/ccpb03.rel -obj/bdosb01.rel -obj/cbios.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/n8.arf b/branches/dgg/cpurom/tmp/stuff/n8.arf deleted file mode 100644 index e280f65a..00000000 --- a/branches/dgg/cpurom/tmp/stuff/n8.arf +++ /dev/null @@ -1,13 +0,0 @@ --mjx --i n8.ihx --k /usr/local/share/sdcc/lib/z80 --l z80 --b _CCPB03 = 0x0900 --b _BDOSB01 = 0x1100 --b _CBIOS = 0x1f00 -obj/loadern8.rel -obj/dbgmon.rel -obj/ccpb03.rel -obj/bdosb01.rel -obj/cbiosn8.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/n8.lk b/branches/dgg/cpurom/tmp/stuff/n8.lk deleted file mode 100644 index e280f65a..00000000 --- a/branches/dgg/cpurom/tmp/stuff/n8.lk +++ /dev/null @@ -1,13 +0,0 @@ --mjx --i n8.ihx --k /usr/local/share/sdcc/lib/z80 --l z80 --b _CCPB03 = 0x0900 --b _BDOSB01 = 0x1100 --b _CBIOS = 0x1f00 -obj/loadern8.rel -obj/dbgmon.rel -obj/ccpb03.rel -obj/bdosb01.rel -obj/cbiosn8.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/n8.lnk b/branches/dgg/cpurom/tmp/stuff/n8.lnk deleted file mode 100644 index e280f65a..00000000 --- a/branches/dgg/cpurom/tmp/stuff/n8.lnk +++ /dev/null @@ -1,13 +0,0 @@ --mjx --i n8.ihx --k /usr/local/share/sdcc/lib/z80 --l z80 --b _CCPB03 = 0x0900 --b _BDOSB01 = 0x1100 --b _CBIOS = 0x1f00 -obj/loadern8.rel -obj/dbgmon.rel -obj/ccpb03.rel -obj/bdosb01.rel -obj/cbiosn8.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/scsi2ide.arf b/branches/dgg/cpurom/tmp/stuff/scsi2ide.arf deleted file mode 100644 index 8ddee2c4..00000000 --- a/branches/dgg/cpurom/tmp/stuff/scsi2ide.arf +++ /dev/null @@ -1,9 +0,0 @@ --mjx --i scsi2ide.ihx --k /Developer/sdcc/share/sdcc/lib/z80 --l z80 --b _DBGMON = 0x8000 -obj/crt0.rel -obj/scsi2ide.rel -obj/dbgmon.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/scsi2ide.lk b/branches/dgg/cpurom/tmp/stuff/scsi2ide.lk deleted file mode 100644 index 8ddee2c4..00000000 --- a/branches/dgg/cpurom/tmp/stuff/scsi2ide.lk +++ /dev/null @@ -1,9 +0,0 @@ --mjx --i scsi2ide.ihx --k /Developer/sdcc/share/sdcc/lib/z80 --l z80 --b _DBGMON = 0x8000 -obj/crt0.rel -obj/scsi2ide.rel -obj/dbgmon.rel --e diff --git a/branches/dgg/cpurom/tmp/stuff/scsi2ide.lnk b/branches/dgg/cpurom/tmp/stuff/scsi2ide.lnk deleted file mode 100644 index 8ddee2c4..00000000 --- a/branches/dgg/cpurom/tmp/stuff/scsi2ide.lnk +++ /dev/null @@ -1,9 +0,0 @@ --mjx --i scsi2ide.ihx --k /Developer/sdcc/share/sdcc/lib/z80 --l z80 --b _DBGMON = 0x8000 -obj/crt0.rel -obj/scsi2ide.rel -obj/dbgmon.rel --e