12 KiB
TRS-80 Model 4p
Ports
Address Read Write
FC-FF Cassette in Cassette out, resets
F8-FB Rd printer status Wr to printer
F4-F7 - Drive select
F3 FDC data reg FDC data reg
F2 FDC sector reg FDC sector reg
F1 FDC track reg FDC track reg
F0 FDC status reg FDC cmd reg
EC-EF Reset RTC INT Mode output
EB RS232 recv holding reg RS232 xmit holding reg
EA UART status reg UART/modem control
E9 - Baud rate register
E8 Modem status Master reset/enable
UART control reg
E4-E7 Rd NMI status Wr NMI mask reg
E0-E3 Rd INT status Wr INT mask reg
CF HD status HD cmd
CE HD size/drv/hd HD size/drv/hd
CD HD cylinder high HD cylinder high
CC HD cylinder low HD cylinder low
CB HD sector # HD sector #
CA HD sector cnt HD sector cnt
C9 HD error reg HD write precomp
C8 HD data reg HD data reg
C7 HD CTC chan 3 HD CTC chan 3
C6 HD CTC chan 2 HD CTC chan 2
C5 HD CTC chan 1 HD CTC chan 1
C4 HD CTC chan 0 HD CTC chan 0
C2-C3 HD device ID -
C1 HD control reg HD Control reg
C0 HD wr prot reg -
94-9F - -
90-93 - Sound option
8C-8F Graphic sel 2 Graphic sel 2
8B CRTC Data reg CRTC Data reg
8A CRTC Control reg CRTC Control reg
89 CRTC Data reg CRTC Data reg
88 CRTC Control reg CRTC Control reg
84-87 - Options reg
83 - Graphic X reg
82 - Graphic Y reg
81 Graphics RAM Graphics RAM
80 - Graphics options reg
Bit map
Address D7 D6 D5 D4 D3 D2 D1 D0
F8-FB-Rd Busy Paper Select Fault - - - -
EC-EF-Rd (any read causes reset of RTC interrupt)
EC-EF-Wr - CPU - Enable Enable Mode Cass -
Fast EX I/O Altset Select Mot on
E0-E3-Rd - Recv Recv Xmit 10 Bus RTC C Fall C Rise
Error Data Empty int Int Int Int
E0-E3-Wr - Enable Enable En.Xmit Enable Enable Enable Enable
Rec err Rec dat Emp 10 int RTC int CF int CR int
90-93-Wr - - - - - - - Sound
Bit
84-87-Wr Page Fix upr Memory Memory Invert 80/64 Select Select
mem bit 1 bit 0 video Bit 1 Bit 0
System memory map
Memory map 1 - model III mode
0000-1fff ROM A (8K)
2000-2fff ROM B (4K)
3000-37ff ROM C (2K) - less 37e8/37e9
37e8-37e9 Printer Status Port
3800-3bff Keyboard
3c00-3fff Video RAM (page bit selects 1K or 2K)
4000-7fff RAM (16K system)
4000-ffff RAM (64K system)
Memory map 2
0000-37ff RAM (14K)
3800-3bff Keyboard
3c00-3fff Video RAM
4000-7fff RAM (16K) end of one 32K bank
8000-ffff RAM (32K) second 32K bank
Memory map 3
0000-7fff RAM (32K) bank 1
8000-f3ff RAM (29K) bank 2
f400-f7ff Keyboard
f800-ffff Video RAM
Memory map 4
0000-7fff RAM (32K) bank 1
8000-ffff RAM (32K) bank 2
TRSDOS memory map
0000-25ff Reserved for TRSDOS operations
2600-2fff Overlay area
3000-HIGH Free to use
HIGH-ffff Drivers, filters, etc
Use `MEMORY` command to know value of `HIGH`
Supervisor calls
SVC are made by loading the correct SVC number in A, other params in other regs,
and then call rst 0x28
.
Z is pretty much always used for success or as a boolean indicator. It is
sometimes not specified when there's not enough tabular space, but it's there.
When -
is specified, it means that the routine either never returns or is
always successful.
Num Name Args Res Desc
00 IPL - - Reboot the system
01 KEY - AZ Scan *KI, wait for char
02 DSP C=char AZ Display character
03 GET DE=F/DCB AZ Get one byte from device or file
04 PUT DE=F/DCB C=char AZ Write one byte to device or file
05 CTL DE=DBC C=func CAZ Output a control byte
06 PRT C=char AZ Send character to printer
07 WHERE - HL Locate origin of SVC
08 KBD - AZ Scan keyboard and return
09 KEYIN HL=buf b=len c=0 HLBZ Accept a line of input
0a DSPLY HL=str AZ Display message line
0b LOGER HL=str AZ Issue log message
0c LOGOT HL=str AZ Display and log message
0d MSG DE=F/DCB HL=str AZ Send message to device
0e PRINT HL=str AZ Print message line
0f VDCTL special spc Video functions
10 PAUSE BC=delay - Suspend program execution
11 PARAM DE=ptbl HL=str Z Parse parameter string
12 DATE HL=recvbuf HLDE Get date
13 TIME HL=recvbuf HLDE Get time
14 CHNIO IX=DCB B=dir C=char - Pass control to next module in device chain
15 ABORT - - Abort Program
16 EXIT HL=retcode - Exit to TRSDOS
18 CMNDI HL=cmd - Exec Cmd w/ return to system
19 CMNDR HL=cmd HL Exec Cmd
1a ERROR C=errno - Entry to post an error message
1b DEBUG - - Enter DEBUG
1c CKTSK C=slot Z Check if task slot in use
1d ADTSK C=slot - Remove interrupt level task
1e RMTSK DE=TCB C=slot - Add an interrupt level task
1f RPTSK - - Replace task vector
20 KLTSK - - Remove currently executing task
21 CKDRV C=drvno Z Check drive
22 DODIR C=drvno b=func ZBHL Do directory display/buffer
23 RAMDIR HL=buf B=dno C=func AZ Get directory record or free space
28 DCSTAT C=drvno Z Test if drive assigned in DCT
29 SLCT C=drvno AZ Select a new drive
2a DCINIT C=drvno AZ Initialize the FDC
2b DCRES C=drvno AZ Reset the FDC
2c RSTOR C=drvno AZ Issue a FDC RESTORE command
2d STEPI C=drvno AZ Issue a FDC STEP IN command
2e SEEK C=drvno DE=addr - Seek a cylinder
2f RSLCT C=drvno - Test for drive busy
30 RDHDR HL=buf DCE=addr AZ Read a sector header
31 RDSEC HL=buf DCE=addr AZ Read a sector
32 VRSEC DCE=addr AZ Verify sector
33 RDTRK HL=buf DCE=addr AZ Read a track
34 HDFMT C=drvno AZ Hard disk format
35 WRSEC HL=buf DCE=addr AZ Write a sector
36 WRSSC HL=buf DCE=addr AZ Write system sector
37 WRTRK HL=buf DCE=addr AZ Write a track
38 RENAM DE=FCB HL=str AZ Rename file
39 REMOV DE=D/FCB AZ Remove file or device
3a INIT HL=buf DE=FCB B=LRL AZ Open or initialize file
3b OPEN HL=buf DE=FCB B=LRL AZ Open existing file or device
3c CLOSE DE=FCB/DCB AZ Close a file or device
3d BKSP DE=FCB AZ Backspace one logical record
3e CKEOF DE=FCB AZ Check for EOF
3f LOC DE=FCB BCAZ Calculate current logical record number
40 LOF DE=FCB BCAZ Calculate the EOF logical record number
41 PEOF DE=FCB AZ Position to end of file
42 POSN DE=FCB BC=LRN AZ Position file
43 READ DE=FCB HL=ptr AZ Read a record
44 REW DE=FCB AZ Rewind file to beginning
45 RREAD DE=FCB AZ Reread sector
46 RWRIT DE=FCB AZ Rewrite sector
47 SEEKSC DE=FCB - Seek cylinder and sector of record
48 SKIP DE=FCB AZ Skip a record
49 VER DE=FCB HLAZ Write and verify a record
4a WEOF DE=FCB AZ Write end of file
4b WRITE DE=FCB HL=ptr AZ Write a record
4c LOAD DE=FCB HLAZ Load program file
4d RUN DE=FCB HLAZ Run program file
4e FSPEC HL=buf DE=F/DCB HLDE Assign file or device specification
4f FEXT DE=FCB HL=str - Set up default file extension
50 FNAME DE=buf B=DEC C=drv AZHL Get filename
51 GTDCT C=drvno IY Get drive code table address
52 GTDCB DE=devname HLAZ Get device control block address
53 GTMOD DE=modname HLDE Get memory module address
55 RDSSC HL=buf DCE=addr AZ Read system sector
57 DIRRD B=dirent C=drvno HLAZ Directory record read
58 DIRWR B=dirent C=drvno HLAZ Directory record write
5a MUL8 C*E A Multiply C by E
5b MUL16 HL*C HLA Multiply HL by C
5d DIV8 E/C AE Divides E by C
5e DIV16 HL/C HLA Divides HL by C
60 DECHEX HL=str BCHL Convert Decimal ASCII to binary
61 HEXDEC HL=num DE=buf DE Convert binary to decimal ASCII
62 HEX8 C=num HL=buf HL Convert 1 byte to hex ASCII
53 HEX16 DE=num HL=buf HL Convert 2 bytes to hex ASCII
64 HIGH$ B=H/L HL=get/set HLAZ Get or Set HIGH$/LOW$
65 FLAGS - IY Point IY to system flag table
66 BANK B=func C=bank BZ Memory bank use
67 BREAK HL=vector HL Set Break vector
68 SOUND B=func - Sound generation
Personal reverse engineering
This section below contains notes about my personal reverse engineering efforts. I'm not an expert in this, and also, I might not be aware of existing, better documentation making this information useless.
Bootable disk
I'm wondering what makes a disk bootable to the TRS-80 and how it boots it.
When I read the raw contents of the first sector of the first cylinder of the
TRS-DOS disk, I see that, except for the 3 first bytes (00fe14
), the rest of
the contents is exactly the same as what is at memory offset 0x0203
, which
seems to indicates that the bootloader simply loads that contents to memory,
leaving the first 3 bytes of RAM to either random contents or some predefined
value (I have f8f800
).
A non-bootable disk starts with 00fe14
, but we can see the message "Cannot
boot, DA TA DISK!" at offset 0x2a
.
I'm not sure what 00fe14
can mean. Disassembled, it's
nop \ rst 0x28 \ ld b, c
. It makes sense that booting would start with a
service call with parameters set by the bootloader (so we don't know what that
service call actually is), but I'm not sure it's what happens.
I don't see any reference to the 0x2a
offset in the data from the first
sector, but anyways, booting with the non-bootable disk doesn't actually prints
the aformentioned message, so it might be a wild goose chase.
In any case, making a disk bootable isn't a concern as long as Collapse OS uses the TRS-DOS drivers.