# 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.