Skip to content

Commit

Permalink
MGTK: Add MulDiv, retire lib
Browse files Browse the repository at this point in the history
Since the routine is used so heavily, add `MulDiv` as a call to MGTK.
While it is pure math and not even used by MGTK itself, so many files
were including lib/muldiv.s that it was getting silly.

This pushed MGTK past the space reserved for it ($4000...$8600) so the
upper limit was bumped up by 2 pages to give more room for future
growth.

All clients are updated; most of them can use a dedicated param block
with constants for either the number, numerator or denominator, which
simplifies the call site. Some that use the routine from main memory
continue to place params at $10... like lib/muldiv.s did. And some
places share param blocks across calls, either because they're using
the blocks at $10 or it was just not worth it to convert.

Overall, this saves space... but it's hard to quantify since it moves
things around a lot. For example, DeskTop still pays for the proc in
aux, but no longer in main. Some param blocks move off the zero page
so it's more bytes to populate each input, but can use constants so
there are fewer inputs to populate.

No functional changes.
  • Loading branch information
inexorabletash committed Feb 10, 2025
1 parent 9b04209 commit 5fc6822
Show file tree
Hide file tree
Showing 22 changed files with 476 additions and 313 deletions.
37 changes: 24 additions & 13 deletions desk.acc/benchmark.s
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,22 @@ counter: .word 0 ; set by `ProbeSpeed`
DEFINE_RECT_SZ meter_left, kMeterLeft, kMeterTop, kMeterWidth, kMeterHeight
DEFINE_RECT_SZ meter_right, kMeterLeft, kMeterTop, kMeterWidth, kMeterHeight

.params ticks_muldiv_params
number: .word kMeterWidth ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word kSpeedMax ; (in) constant
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

.params progress_muldiv_params
number: .word kMeterWidth ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word 0 ; (in) populated dynamically
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

pattern_left:
.byte %01000100
.byte %00010001
Expand Down Expand Up @@ -163,12 +179,9 @@ pattern_right:

lda #0
loop: pha
sta z:muldiv_numerator
copy #0, z:muldiv_numerator+1
copy16 #kSpeedMax, z:muldiv_denominator
copy16 #kMeterWidth, z:muldiv_number
jsr MulDiv
add16 meter_left::x1, z:muldiv_result, pt_tick::xcoord
sta ticks_muldiv_params::numerator
MGTK_CALL MGTK::MulDiv, ticks_muldiv_params
add16 meter_left::x1, ticks_muldiv_params::result, pt_tick::xcoord
MGTK_CALL MGTK::MoveTo, pt_tick
MGTK_CALL MGTK::Line, pt_tickdelta
pla
Expand Down Expand Up @@ -338,17 +351,16 @@ done: jmp InputLoop
.proc UpdateMeter
jsr ProbeSpeed

copy16 counter, z:muldiv_numerator
copy16 counter, progress_muldiv_params::numerator
bit radio_60hz_button::state
IF_NS
copy16 #kSpeedMax * kSpeedDefault60Hz, z:muldiv_denominator
copy16 #kSpeedMax * kSpeedDefault60Hz, progress_muldiv_params::denominator
ELSE
copy16 #kSpeedMax * kSpeedDefault50Hz, z:muldiv_denominator
copy16 #kSpeedMax * kSpeedDefault50Hz, progress_muldiv_params::denominator
END_IF
copy16 #kMeterWidth, z:muldiv_number

jsr MulDiv
add16 meter_left::x1, z:muldiv_result, meter_left::x2
MGTK_CALL MGTK::MulDiv, progress_muldiv_params
add16 meter_left::x1, progress_muldiv_params::result, meter_left::x2
add16 meter_left::x2, #1, meter_right::x1

MGTK_CALL MGTK::SetPenMode, pencopy
Expand Down Expand Up @@ -502,7 +514,6 @@ loop2c:

;;; ============================================================

.include "../lib/muldiv.s"
.include "../lib/inttostring.s"
.include "../lib/uppercase.s"

Expand Down
56 changes: 37 additions & 19 deletions desk.acc/dos33.import.s
Original file line number Diff line number Diff line change
Expand Up @@ -472,6 +472,22 @@ port: .addr grafport_win

DEFINE_LABEL disk_vol, res_string_disk_volume_prefix, 20, 18

.params entry_muldiv_params
number: .word 0 ; (in) populated dynamically
numerator: .word .sizeof(CatalogEntry) ; (in) constant
denominator: .word 1 ; (in) constant
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

.params progress_muldiv_params
number: .word kProgressBarWidth ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word 0 ; (in) populated dynamically
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

;;; ============================================================

.proc Init
Expand Down Expand Up @@ -664,12 +680,9 @@ done: rts

;; Calculate address of `CatalogEntry`
ptr := $04
sta z:muldiv_number
copy #0, z:muldiv_number+1
copy16 #.sizeof(CatalogEntry), z:muldiv_numerator
copy16 #1, z:muldiv_denominator
jsr MulDiv
add16 z:muldiv_result, #EntryBuffer, ptr
sta entry_muldiv_params::number
MGTK_CALL MGTK::MulDiv, entry_muldiv_params
add16 entry_muldiv_params::result, #EntryBuffer, ptr

kLockedX = 8
kTypeX = 20
Expand Down Expand Up @@ -749,11 +762,10 @@ ret: rts
;; ASSERT: Not obscured.
MGTK_CALL MGTK::SetPort, grafport_win

copy16 control_block+ControlBlock::progress_num, z:muldiv_numerator
copy16 control_block+ControlBlock::progress_denom, z:muldiv_denominator
copy16 #kProgressBarWidth, z:muldiv_number
jsr MulDiv
add16 z:muldiv_result, progress_meter::x1, progress_meter::x2
copy16 control_block+ControlBlock::progress_num, progress_muldiv_params::numerator
copy16 control_block+ControlBlock::progress_denom, progress_muldiv_params::denominator
MGTK_CALL MGTK::MulDiv, progress_muldiv_params
add16 progress_muldiv_params::result, progress_meter::x1, progress_meter::x2

MGTK_CALL MGTK::SetPattern, progress_pattern
MGTK_CALL MGTK::SetPenMode, pencopy
Expand Down Expand Up @@ -818,7 +830,6 @@ str_from_int: PASCAL_STRING "000000" ; filled in by IntToString
.include "../lib/drawstring.s"
.include "../lib/get_next_event.s"
.include "../lib/doubleclick.s"
.include "../lib/muldiv.s"
.include "../lib/inttostring.s"

.assert * < EntryBuffer, error, "DA too large"
Expand Down Expand Up @@ -1073,16 +1084,24 @@ control_block:
set_eof_flag: .byte 0
tslist_offset: .byte 0

PARAM_BLOCK muldiv_params, $10
number .word ; (in)
numerator .word ; (in)
denominator .word ; (in)
result .word ; (out)
remainder .word ; (out)
END_PARAM_BLOCK

start:
jsr FetchControlBlock

;; Fetch `CatalogEntry`
copy control_block+ControlBlock::selected_index, z:muldiv_number
copy #0, z:muldiv_number+1
copy16 #.sizeof(aux::CatalogEntry), z:muldiv_numerator
copy16 #1, z:muldiv_denominator
jsr MulDiv
add16 z:muldiv_result, #aux::EntryBuffer, STARTLO
copy control_block+ControlBlock::selected_index, muldiv_params::number
copy #0, muldiv_params::number+1
copy16 #.sizeof(aux::CatalogEntry), muldiv_params::numerator
copy16 #1, muldiv_params::denominator
JUMP_TABLE_MGTK_CALL MGTK::MulDiv, muldiv_params
add16 muldiv_params::result, #aux::EntryBuffer, STARTLO
add16 STARTLO, #.sizeof(aux::CatalogEntry)-1, ENDLO
copy16 #entry_buf, DESTINATIONLO
clc ; aux>main
Expand Down Expand Up @@ -1554,7 +1573,6 @@ RWTSWrite := RWTSImpl::Write
;;; ============================================================

.include "../lib/is_diskii.s"
.include "../lib/muldiv.s"

;;; ============================================================

Expand Down
72 changes: 46 additions & 26 deletions desk.acc/map.s
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,39 @@ kMapTop = 5
kMapWidth = 230
kMapHeight = 52

.params y_to_lat
number: .word 180 ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word kMapHeight ; (in) constant
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

.params x_to_long
number: .word 360 ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word kMapWidth ; (in) constant
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

.params lat_to_y
number: .word kMapHeight ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word 180 ; (in) constant
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams

.params long_to_x
number: .word kMapWidth ; (in) constant
numerator: .word 0 ; (in) populated dynamically
denominator: .word 360 ; (in) constant
result: .word 0 ; (out)
remainder: .word 0 ; (out)
.endparams


pensize_normal: .byte 1, 1
pensize_frame: .byte 2, 1

Expand Down Expand Up @@ -465,22 +498,16 @@ index: .byte 0
END_IF

;; Compute new position
sub16 screentowindow_params::windowx, #kMapLeft+1, long
sub16 screentowindow_params::windowy, #kMapTop, lat

;; Map latitude to +90...-90
copy16 lat, z:muldiv_numerator
copy16 #kMapHeight, z:muldiv_denominator
copy16 #180, z:muldiv_number
jsr MulDiv
sub16 #90, z:muldiv_result, lat
sub16 screentowindow_params::windowy, #kMapTop, y_to_lat::numerator
MGTK_CALL MGTK::MulDiv, y_to_lat
sub16 #90, y_to_lat::result, lat

;; Map longitude to -180...+180
copy16 long, z:muldiv_numerator
copy16 #kMapWidth, z:muldiv_denominator
copy16 #360, z:muldiv_number
jsr MulDiv
sub16 z:muldiv_result, #180, long
sub16 screentowindow_params::windowx, #kMapLeft+1, x_to_long::numerator
MGTK_CALL MGTK::MulDiv, x_to_long
sub16 x_to_long::result, #180, long

;; Update display
jsr SetPort
Expand Down Expand Up @@ -680,29 +707,22 @@ blink_counter:

.proc UpdateCoordsFromLatLong
;; Map latitude from +90...-90
sub16 #90, lat, z:muldiv_numerator ; 90...-90 to 0...180
copy16 #180, z:muldiv_denominator
copy16 #kMapHeight, z:muldiv_number
jsr MulDiv
copy16 z:muldiv_result, ycoord
sub16 #90, lat, lat_to_y::numerator ; 90...-90 to 0...180
MGTK_CALL MGTK::MulDiv, lat_to_y
add16 lat_to_y::result, #kMapTop - (kPositionMarkerHeight/2), ycoord

;; Map longitude from -180...+180
add16 long, #180, z:muldiv_numerator ; -180...180 to 0...360
copy16 #360, z:muldiv_denominator
copy16 #kMapWidth, z:muldiv_number
jsr MulDiv
copy16 z:muldiv_result, xcoord

add16 xcoord, #kMapLeft+1 - (kPositionMarkerWidth/2), xcoord
add16 ycoord, #kMapTop - (kPositionMarkerHeight/2), ycoord
add16 long, #180, long_to_x::numerator ; -180...180 to 0...360
MGTK_CALL MGTK::MulDiv, long_to_x
add16 long_to_x::result, #kMapLeft+1 - (kPositionMarkerWidth/2), xcoord

rts
.endproc ; UpdateCoordsFromLatLong

;;; ============================================================

.include "../lib/drawstring.s"
.include "../lib/inttostring.s"
.include "../lib/muldiv.s"
.include "../lib/get_next_event.s"

;;; ============================================================
Expand Down
35 changes: 21 additions & 14 deletions desk.acc/neko.s
Original file line number Diff line number Diff line change
Expand Up @@ -1011,35 +1011,42 @@ result: .byte 1

;;; ============================================================

PARAM_BLOCK muldiv_params, $10
number .word ; (in)
numerator .word ; (in)
denominator .word ; (in)
result .word ; (out)
remainder .word ; (out)
END_PARAM_BLOCK

;;; A,X = A,X * Y
.proc Multiply_16_8_16
stax z:muldiv_number
sty z:muldiv_numerator
copy #0, z:muldiv_numerator+1
copy16 #1, z:muldiv_denominator
jsr MulDiv
ldax z:muldiv_result
stax muldiv_params::number
sty muldiv_params::numerator
copy #0, muldiv_params::numerator+1
copy16 #1, muldiv_params::denominator
JUMP_TABLE_MGTK_CALL MGTK::MulDiv, muldiv_params
ldax muldiv_params::result
rts
.endproc ; Multiply_16_8_16

;;; ============================================================

;;; A,X = A,X / Y, Y = remainder
.proc Divide_16_8_16
stax z:muldiv_numerator
sty z:muldiv_denominator
copy #0, z:muldiv_denominator+1
copy16 #1, z:muldiv_number
jsr MulDiv
ldax z:muldiv_result
ldy z:muldiv_remainder
stax muldiv_params::numerator
sty muldiv_params::denominator
copy #0, muldiv_params::denominator+1
copy16 #1, muldiv_params::number
JUMP_TABLE_MGTK_CALL MGTK::MulDiv, muldiv_params
ldax muldiv_params::result
ldy muldiv_params::remainder
rts
.endproc ; Divide_16_8_16

;;; ============================================================

.include "../lib/uppercase.s"
.include "../lib/muldiv.s"

;;; ============================================================

Expand Down
Loading

0 comments on commit 5fc6822

Please sign in to comment.